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,1281 @@
1
+ #!/usr/bin/env python3
2
+ # CUI // SP-CTI
3
+ # Controlled by: Department of Defense
4
+ # CUI Category: CTI
5
+ # Distribution: D
6
+ # POC: SPARKPILOT System Administrator
7
+ """ATO Boundary Impact Analyzer — 4-tier (GREEN/YELLOW/ORANGE/RED) scoring.
8
+
9
+ Registers ATO system boundaries, assesses how new requirements affect an
10
+ existing ATO, and generates alternative courses of action (COAs) for
11
+ RED-tier impacts that would invalidate the current authorization.
12
+
13
+ Part of the RICOAS (Requirements Intake, Compliance, Orchestration,
14
+ Assessment, Supply-chain) pipeline.
15
+
16
+ Usage:
17
+ # Register an ATO system boundary
18
+ python tools/requirements/boundary_analyzer.py --project-id proj-123 \\
19
+ --register-system --system-name "My System" --ato-status active \\
20
+ --classification CUI --impact-level IL5 --json
21
+
22
+ # Assess a requirement against a system boundary
23
+ python tools/requirements/boundary_analyzer.py --project-id proj-123 \\
24
+ --system-id sys-abc --requirement-id req-xyz --json
25
+
26
+ # Generate alternatives for a RED-tier assessment
27
+ python tools/requirements/boundary_analyzer.py --project-id proj-123 \\
28
+ --generate-alternatives --assessment-id bia-abc --json
29
+
30
+ # List registered ATO systems
31
+ python tools/requirements/boundary_analyzer.py --project-id proj-123 \\
32
+ --list-systems --json
33
+
34
+ # List boundary assessments (optionally filtered by tier)
35
+ python tools/requirements/boundary_analyzer.py --project-id proj-123 \\
36
+ --list-assessments --json
37
+ python tools/requirements/boundary_analyzer.py --project-id proj-123 \\
38
+ --list-assessments --tier RED --json
39
+ """
40
+
41
+ import argparse
42
+ import json
43
+ import os
44
+ import sqlite3
45
+ import uuid
46
+ from datetime import datetime, timezone
47
+ from pathlib import Path
48
+ from tools.db.storage import get_connection
49
+
50
+ BASE_DIR = Path(__file__).resolve().parent.parent.parent
51
+
52
+ # Graceful import of audit logger
53
+ try:
54
+ from tools.audit.audit_logger import log_event
55
+ _HAS_AUDIT = True
56
+ except ImportError:
57
+ _HAS_AUDIT = False
58
+ def log_event(**kwargs) -> int: # type: ignore[misc]
59
+ return -1
60
+
61
+
62
+ # ---------------------------------------------------------------------------
63
+ # Database helpers
64
+ # ---------------------------------------------------------------------------
65
+
66
+
67
+ def _generate_id(prefix="bia"):
68
+ """Generate a unique ID with prefix."""
69
+ return f"{prefix}-{uuid.uuid4().hex[:12]}"
70
+
71
+
72
+ # ---------------------------------------------------------------------------
73
+ # Tier scoring constants
74
+ # ---------------------------------------------------------------------------
75
+
76
+ # Keywords that push the score toward each tier
77
+ _GREEN_KEYWORDS = [
78
+ "existing", "current", "internal", "within boundary", "already authorized",
79
+ "minor update", "configuration change", "patch", "maintenance",
80
+ "existing component", "existing service", "within enclave",
81
+ ]
82
+
83
+ _YELLOW_KEYWORDS = [
84
+ "new component", "new role", "additional service", "internal service",
85
+ "new user type", "new module", "add feature", "minor integration",
86
+ "new port", "new protocol", "additional logging", "new database table",
87
+ ]
88
+
89
+ _ORANGE_KEYWORDS = [
90
+ "external", "interconnect", "cross-boundary", "new data flow",
91
+ "api integration", "third-party", "new interface", "new connection",
92
+ "cross-domain", "mobile", "byod", "cloud service", "saas",
93
+ "new network segment", "dmz", "partner system", "vendor api",
94
+ ]
95
+
96
+ _RED_KEYWORDS = [
97
+ "classification change", "secret", "ts/sci", "top secret",
98
+ "boundary expansion", "prohibited", "new network", "air gap",
99
+ "classification upgrade", "new enclave", "sipr", "jwics",
100
+ "foreign national", "non-us entity", "unapproved technology",
101
+ "remove encryption", "bypass authentication",
102
+ ]
103
+
104
+ # NIST 800-53 control families to keyword mapping for affected control detection
105
+ _CONTROL_KEYWORD_MAP = {
106
+ "AC-2": ["account", "user", "role", "access", "provision", "deprovisio"],
107
+ "AC-3": ["access control", "permission", "authorization", "enforce"],
108
+ "AC-4": ["data flow", "information flow", "cross-boundary", "filter"],
109
+ "AC-17": ["remote access", "vpn", "remote", "telework"],
110
+ "AC-19": ["mobile", "byod", "device", "mdm", "portable"],
111
+ "AC-20": ["external system", "external information", "third-party system"],
112
+ "AU-2": ["audit", "log", "event", "monitor"],
113
+ "AU-6": ["audit review", "log analysis", "audit reduction"],
114
+ "CA-3": ["interconnect", "isa", "mou", "system connection", "interface"],
115
+ "CA-9": ["internal system", "internal connection"],
116
+ "CM-3": ["configuration change", "change control", "baseline"],
117
+ "CM-7": ["function", "service", "port", "protocol"],
118
+ "IA-2": ["authenticat", "identity", "cac", "piv", "mfa", "credential"],
119
+ "IA-5": ["password", "credential", "authenticator", "pki", "certificate"],
120
+ "IR-4": ["incident", "response", "breach", "compromise"],
121
+ "PE-3": ["physical", "facility", "data center", "server room"],
122
+ "PL-4": ["rules of behavior", "acceptable use"],
123
+ "RA-5": ["vulnerabilit", "scan", "patch", "remediat"],
124
+ "SA-9": ["external service", "cloud service", "saas", "vendor"],
125
+ "SC-7": ["boundary", "firewall", "proxy", "dmz", "network perimeter"],
126
+ "SC-8": ["transmission", "encrypt", "tls", "fips", "in transit"],
127
+ "SC-28": ["data at rest", "storage", "encrypt", "fips"],
128
+ "SI-4": ["monitoring", "ids", "ips", "intrusion", "detect"],
129
+ }
130
+
131
+ # SSP section mapping to keywords
132
+ _SSP_SECTION_MAP = {
133
+ "Section 1 - System Name/Title": ["system name", "rename", "redesignate"],
134
+ "Section 2 - System Categorization": ["classification", "impact level", "categoriz"],
135
+ "Section 3 - System Owner": ["owner", "authorizing official", "isso"],
136
+ "Section 9 - System Interconnections": [
137
+ "interconnect", "interface", "external system", "isa", "mou",
138
+ "cross-boundary", "data flow", "api integration", "third-party",
139
+ ],
140
+ "Section 10 - Applicable Laws and Regulations": ["regulation", "law", "policy", "mandate"],
141
+ "Section 11 - Minimum Security Controls": [
142
+ "control", "nist", "baseline", "security requirement",
143
+ ],
144
+ "Section 13 - System Architecture": [
145
+ "architecture", "component", "network", "topology", "boundary",
146
+ "new service", "new module", "new component",
147
+ ],
148
+ "Section 14 - Network Diagram": [
149
+ "network", "diagram", "topology", "segment", "dmz", "enclave",
150
+ ],
151
+ "Section 15 - Data Flow Diagram": [
152
+ "data flow", "information flow", "cross-boundary", "data path",
153
+ ],
154
+ "Section 16 - Ports, Protocols, and Services": [
155
+ "port", "protocol", "service", "firewall rule",
156
+ ],
157
+ "Section 17 - Hardware/Software Inventory": [
158
+ "hardware", "software", "component", "inventory", "new server",
159
+ "new application", "cots", "gots",
160
+ ],
161
+ }
162
+
163
+
164
+ # ---------------------------------------------------------------------------
165
+ # Impact category detection
166
+ # ---------------------------------------------------------------------------
167
+
168
+ _IMPACT_CATEGORY_KEYWORDS = {
169
+ "architecture": ["architecture", "component", "module", "service", "redesign", "refactor"],
170
+ "data_flow": ["data flow", "information flow", "data path", "etl", "pipeline"],
171
+ "authentication": ["authenticat", "login", "sso", "cac", "piv", "mfa", "identity"],
172
+ "authorization": ["authoriz", "permission", "role", "rbac", "access control"],
173
+ "network": ["network", "firewall", "port", "protocol", "segment", "dmz", "vpn"],
174
+ "encryption": ["encrypt", "tls", "ssl", "fips", "certificate", "pki"],
175
+ "logging": ["log", "audit", "monitor", "siem", "event"],
176
+ "boundary_change": ["boundary", "enclave", "perimeter", "classification", "expand"],
177
+ "new_interconnection": ["interconnect", "interface", "external system", "isa", "mou"],
178
+ "data_type_change": ["data type", "classification", "cui", "secret", "pii", "phi"],
179
+ "component_addition": ["new component", "new server", "new service", "add module", "install"],
180
+ }
181
+
182
+
183
+ # ---------------------------------------------------------------------------
184
+ # Core functions
185
+ # ---------------------------------------------------------------------------
186
+
187
+ def register_system(
188
+ project_id: str,
189
+ system_name: str,
190
+ ato_status: str = "active",
191
+ boundary_definition: dict = None,
192
+ baseline_controls: list = None,
193
+ classification: str = "CUI",
194
+ impact_level: str = "IL5",
195
+ connected_systems: list = None,
196
+ ato_expiry_date: str = None,
197
+ isso_name: str = None,
198
+ isso_email: str = None,
199
+ db_path=None,
200
+ ) -> dict:
201
+ """Register an existing ATO system boundary in ato_system_registry.
202
+
203
+ Args:
204
+ project_id: SPARKPILOT project ID.
205
+ system_name: Human-readable system name.
206
+ ato_status: One of active, provisional, expired, pending.
207
+ boundary_definition: JSON-serializable dict describing the boundary.
208
+ baseline_controls: List of NIST control IDs (e.g. ['AC-2', 'AU-2']).
209
+ classification: CUI, SECRET, etc.
210
+ impact_level: IL2, IL4, IL5, or IL6.
211
+ connected_systems: List of connected system identifiers.
212
+ ato_expiry_date: ISO date string for ATO expiry.
213
+ isso_name: ISSO point of contact name.
214
+ isso_email: ISSO point of contact email.
215
+ db_path: Optional database path override.
216
+
217
+ Returns:
218
+ dict with system_id, system_name, ato_status, baseline_controls_count.
219
+ """
220
+ valid_statuses = ("active", "provisional", "expired", "pending")
221
+ if ato_status not in valid_statuses:
222
+ raise ValueError(
223
+ f"Invalid ato_status '{ato_status}'. Must be one of: {valid_statuses}"
224
+ )
225
+
226
+ valid_levels = ("IL2", "IL4", "IL5", "IL6")
227
+ if impact_level not in valid_levels:
228
+ raise ValueError(
229
+ f"Invalid impact_level '{impact_level}'. Must be one of: {valid_levels}"
230
+ )
231
+
232
+ system_id = _generate_id("sys")
233
+ boundary_def = boundary_definition or {}
234
+ controls = baseline_controls or []
235
+ connected = connected_systems or []
236
+ now = datetime.now(timezone.utc).isoformat()
237
+
238
+ # Map ato_status to the DB ato_type enum
239
+ status_to_type = {
240
+ "active": "ato",
241
+ "provisional": "iato",
242
+ "expired": "ato",
243
+ "pending": None,
244
+ }
245
+ ato_type = status_to_type.get(ato_status)
246
+
247
+ conn = get_connection(db_path=db_path)
248
+
249
+ # Validate project exists
250
+ row = conn.execute(
251
+ "SELECT id FROM projects WHERE id = ?", (project_id,)
252
+ ).fetchone()
253
+ if not row:
254
+ conn.close()
255
+ raise ValueError(f"Project '{project_id}' not found in database.")
256
+
257
+ conn.execute(
258
+ """INSERT INTO ato_system_registry
259
+ (id, project_id, system_name, ato_type, ato_date, ato_expiry,
260
+ authorizing_official, accreditation_boundary, impact_level,
261
+ data_types, interconnections, baseline_controls,
262
+ component_inventory, classification, created_at, updated_at)
263
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
264
+ (
265
+ system_id,
266
+ project_id,
267
+ system_name,
268
+ ato_type,
269
+ now if ato_status == "active" else None,
270
+ ato_expiry_date,
271
+ isso_name,
272
+ json.dumps(boundary_def),
273
+ impact_level,
274
+ json.dumps(boundary_def.get("data_types", [])),
275
+ json.dumps(connected),
276
+ json.dumps(controls),
277
+ json.dumps(boundary_def.get("components", [])),
278
+ classification,
279
+ now,
280
+ now,
281
+ ),
282
+ )
283
+ conn.commit()
284
+ conn.close()
285
+
286
+ if _HAS_AUDIT:
287
+ log_event(
288
+ event_type="system_registered",
289
+ actor="boundary-analyzer",
290
+ action=f"Registered ATO system '{system_name}' ({system_id})",
291
+ project_id=project_id,
292
+ details={
293
+ "system_id": system_id,
294
+ "ato_status": ato_status,
295
+ "impact_level": impact_level,
296
+ "baseline_controls_count": len(controls),
297
+ },
298
+ )
299
+
300
+ return {
301
+ "status": "ok",
302
+ "system_id": system_id,
303
+ "system_name": system_name,
304
+ "ato_status": ato_status,
305
+ "baseline_controls_count": len(controls),
306
+ }
307
+
308
+
309
+ def get_system(system_id: str, db_path=None) -> dict:
310
+ """Get system details by ID.
311
+
312
+ Args:
313
+ system_id: The ATO system registry ID.
314
+ db_path: Optional database path override.
315
+
316
+ Returns:
317
+ dict with full system details.
318
+ """
319
+ conn = get_connection(db_path=db_path)
320
+ row = conn.execute(
321
+ "SELECT * FROM ato_system_registry WHERE id = ?", (system_id,)
322
+ ).fetchone()
323
+ conn.close()
324
+
325
+ if not row:
326
+ raise ValueError(f"System '{system_id}' not found.")
327
+
328
+ data = dict(row)
329
+ # Parse JSON fields
330
+ for field in ("accreditation_boundary", "data_types", "interconnections",
331
+ "baseline_controls", "component_inventory"):
332
+ val = data.get(field)
333
+ if val and isinstance(val, str):
334
+ try:
335
+ data[field] = json.loads(val)
336
+ except (json.JSONDecodeError, TypeError):
337
+ pass
338
+
339
+ return {"status": "ok", "system": data}
340
+
341
+
342
+ def list_systems(project_id: str, db_path=None) -> dict:
343
+ """List all registered ATO systems for a project.
344
+
345
+ Args:
346
+ project_id: SPARKPILOT project ID.
347
+ db_path: Optional database path override.
348
+
349
+ Returns:
350
+ dict with list of systems.
351
+ """
352
+ conn = get_connection(db_path=db_path)
353
+ rows = conn.execute(
354
+ """SELECT id, project_id, system_name, ato_type, ato_expiry,
355
+ impact_level, classification, created_at
356
+ FROM ato_system_registry
357
+ WHERE project_id = ?
358
+ ORDER BY created_at""",
359
+ (project_id,),
360
+ ).fetchall()
361
+ conn.close()
362
+
363
+ systems = []
364
+ for r in rows:
365
+ d = dict(r)
366
+ # Derive a human-friendly ato_status
367
+ d["ato_status"] = _ato_type_to_status(d.get("ato_type"), d.get("ato_expiry"))
368
+ systems.append(d)
369
+
370
+ return {
371
+ "status": "ok",
372
+ "project_id": project_id,
373
+ "system_count": len(systems),
374
+ "systems": systems,
375
+ }
376
+
377
+
378
+ def _ato_type_to_status(ato_type, ato_expiry):
379
+ """Map DB ato_type + expiry to user-facing status."""
380
+ if ato_type is None:
381
+ return "pending"
382
+ if ato_type == "iato":
383
+ return "provisional"
384
+ if ato_expiry:
385
+ try:
386
+ expiry_dt = datetime.fromisoformat(ato_expiry)
387
+ if expiry_dt < datetime.now(timezone.utc):
388
+ return "expired"
389
+ except (ValueError, TypeError):
390
+ pass
391
+ return "active"
392
+
393
+
394
+ # ---------------------------------------------------------------------------
395
+ # Boundary impact assessment
396
+ # ---------------------------------------------------------------------------
397
+
398
+ def _score_text_against_keywords(text_lower: str, keywords: list) -> int:
399
+ """Count how many keywords match in the text."""
400
+ return sum(1 for kw in keywords if kw in text_lower)
401
+
402
+
403
+ def _determine_impact_tier(text_lower: str, system_data: dict) -> tuple:
404
+ """Determine the impact tier and numeric score for a requirement.
405
+
406
+ Returns:
407
+ (tier, score, impact_category, description)
408
+ """
409
+ red_hits = _score_text_against_keywords(text_lower, _RED_KEYWORDS)
410
+ orange_hits = _score_text_against_keywords(text_lower, _ORANGE_KEYWORDS)
411
+ yellow_hits = _score_text_against_keywords(text_lower, _YELLOW_KEYWORDS)
412
+ green_hits = _score_text_against_keywords(text_lower, _GREEN_KEYWORDS)
413
+
414
+ # Classification escalation is always RED regardless of other signals
415
+ system_level = (system_data.get("impact_level") or "IL5").upper()
416
+ if system_level in ("IL2", "IL4", "IL5"):
417
+ for kw in ["secret", "ts/sci", "top secret", "jwics", "sipr"]:
418
+ if kw in text_lower:
419
+ return (
420
+ "RED",
421
+ 95,
422
+ "boundary_change",
423
+ f"Classification upgrade detected. Current system is {system_level} "
424
+ f"but requirement references data/networks above this level. "
425
+ f"This would INVALIDATE the current ATO.",
426
+ )
427
+
428
+ # Boundary expansion keywords are RED
429
+ for kw in ["boundary expansion", "new enclave", "new network"]:
430
+ if kw in text_lower:
431
+ return (
432
+ "RED",
433
+ 85,
434
+ "boundary_change",
435
+ "Boundary expansion required. The current accreditation boundary "
436
+ "would need to be redrawn, requiring full re-authorization.",
437
+ )
438
+
439
+ # Prohibited technology
440
+ if "prohibited" in text_lower or "unapproved technology" in text_lower:
441
+ return (
442
+ "RED",
443
+ 90,
444
+ "component_addition",
445
+ "Prohibited or unapproved technology referenced. Cannot proceed "
446
+ "within existing ATO. Must generate alternative COAs.",
447
+ )
448
+
449
+ # Score-based determination
450
+ # Weight: RED=25, ORANGE=15, YELLOW=8, GREEN=2 (per hit)
451
+ raw_score = (
452
+ red_hits * 25
453
+ + orange_hits * 15
454
+ + yellow_hits * 8
455
+ + green_hits * 2
456
+ )
457
+
458
+ # Normalize to 0-100, clamped
459
+ # If no keywords matched at all, default to GREEN with low score
460
+ if red_hits + orange_hits + yellow_hits + green_hits == 0:
461
+ score = 10
462
+ else:
463
+ score = min(100, max(0, raw_score))
464
+
465
+ # Determine category
466
+ category = _detect_impact_category(text_lower)
467
+
468
+ # Determine tier from score
469
+ if score >= 76:
470
+ tier = "RED"
471
+ description = (
472
+ "ATO-invalidating change detected. This requirement introduces changes "
473
+ "that exceed the current authorization boundary. FULL STOP required. "
474
+ "Must generate alternative COAs before proceeding."
475
+ )
476
+ elif score >= 51:
477
+ tier = "ORANGE"
478
+ description = (
479
+ "Significant boundary change required. This requirement introduces "
480
+ "cross-boundary data flows or new interconnections that require SSP "
481
+ "revision, ISSO review, and possible re-authorization."
482
+ )
483
+ elif score >= 26:
484
+ tier = "YELLOW"
485
+ description = (
486
+ "Minor boundary adjustment needed. This requirement adds new components "
487
+ "or capabilities within the existing boundary. Requires SSP addendum "
488
+ "and possible POAM entry."
489
+ )
490
+ else:
491
+ tier = "GREEN"
492
+ description = (
493
+ "Requirement fits within existing ATO boundary. No boundary changes "
494
+ "needed. Standard change control process applies."
495
+ )
496
+
497
+ return tier, score, category, description
498
+
499
+
500
+ def _detect_impact_category(text_lower: str) -> str:
501
+ """Detect the primary impact category from requirement text."""
502
+ best_category = "architecture"
503
+ best_count = 0
504
+
505
+ for category, keywords in _IMPACT_CATEGORY_KEYWORDS.items():
506
+ count = sum(1 for kw in keywords if kw in text_lower)
507
+ if count > best_count:
508
+ best_count = count
509
+ best_category = category
510
+
511
+ return best_category
512
+
513
+
514
+ def _detect_affected_controls(text_lower: str) -> list:
515
+ """Detect NIST 800-53 controls potentially affected by the requirement."""
516
+ affected = []
517
+ for control_id, keywords in _CONTROL_KEYWORD_MAP.items():
518
+ if any(kw in text_lower for kw in keywords):
519
+ affected.append(control_id)
520
+ return sorted(affected)
521
+
522
+
523
+ def _detect_affected_ssp_sections(text_lower: str) -> list:
524
+ """Detect SSP sections that would need updating."""
525
+ affected = []
526
+ for section_name, keywords in _SSP_SECTION_MAP.items():
527
+ if any(kw in text_lower for kw in keywords):
528
+ affected.append(section_name)
529
+ return affected
530
+
531
+
532
+ def _generate_remediation_steps(tier: str, category: str, affected_controls: list,
533
+ affected_sections: list) -> list:
534
+ """Generate remediation steps based on tier and impact."""
535
+ steps = []
536
+
537
+ if tier == "GREEN":
538
+ steps.append("Submit standard change request through configuration management (CM-3).")
539
+ steps.append("Update component inventory if adding software/hardware.")
540
+ steps.append("Run regression security scan after implementation.")
541
+ return steps
542
+
543
+ if tier == "YELLOW":
544
+ steps.append("Prepare SSP addendum documenting the change.")
545
+ if affected_controls:
546
+ steps.append(
547
+ f"Update control implementations for: {', '.join(affected_controls[:5])}."
548
+ )
549
+ steps.append("Submit change to ISSO for review and approval.")
550
+ if category == "component_addition":
551
+ steps.append("Update hardware/software inventory (SSP Section 17).")
552
+ steps.append("Run vulnerability scan on new component.")
553
+ steps.append("Create POAM entry if any control gaps are introduced.")
554
+ steps.append("Update SBOM after implementation.")
555
+ return steps
556
+
557
+ if tier == "ORANGE":
558
+ steps.append("ISSO review REQUIRED before proceeding.")
559
+ steps.append("Prepare formal SSP revision (not just addendum).")
560
+ if "Section 9 - System Interconnections" in affected_sections:
561
+ steps.append("Draft Interconnection Security Agreement (ISA) / MOU.")
562
+ if "Section 14 - Network Diagram" in affected_sections:
563
+ steps.append("Update network architecture diagram.")
564
+ if "Section 15 - Data Flow Diagram" in affected_sections:
565
+ steps.append("Update data flow diagrams showing new cross-boundary flows.")
566
+ if affected_controls:
567
+ steps.append(
568
+ f"Re-assess controls: {', '.join(affected_controls[:8])}."
569
+ )
570
+ steps.append("Conduct risk assessment for the boundary modification.")
571
+ steps.append("Determine if partial re-authorization is sufficient or full ATO required.")
572
+ steps.append("Update POA&M with any new findings.")
573
+ return steps
574
+
575
+ # RED
576
+ steps.append("FULL STOP — Do NOT proceed with implementation.")
577
+ steps.append("Notify ISSO and Authorizing Official (AO) immediately.")
578
+ steps.append("Generate alternative courses of action (COAs) using generate_alternatives().")
579
+ steps.append("Conduct formal risk assessment with AO participation.")
580
+ steps.append("If proceeding, initiate full re-authorization process.")
581
+ if affected_controls:
582
+ steps.append(
583
+ f"All affected controls require full re-assessment: {', '.join(affected_controls)}."
584
+ )
585
+ steps.append("Budget 90-180 days for re-authorization timeline.")
586
+ return steps
587
+
588
+
589
+ def assess_boundary_impact(
590
+ project_id: str,
591
+ system_id: str,
592
+ requirement_id: str,
593
+ db_path=None,
594
+ ) -> dict:
595
+ """Assess a single requirement's impact on an existing ATO boundary.
596
+
597
+ Args:
598
+ project_id: SPARKPILOT project ID.
599
+ system_id: Registered ATO system ID.
600
+ requirement_id: Intake requirement ID to assess.
601
+ db_path: Optional database path override.
602
+
603
+ Returns:
604
+ dict with assessment_id, impact_tier, impact_score,
605
+ affected_controls, affected_ssp_sections, remediation_steps.
606
+ """
607
+ conn = get_connection(db_path=db_path)
608
+
609
+ # Load the requirement
610
+ req_row = conn.execute(
611
+ "SELECT * FROM intake_requirements WHERE id = ?", (requirement_id,)
612
+ ).fetchone()
613
+ if not req_row:
614
+ conn.close()
615
+ raise ValueError(f"Requirement '{requirement_id}' not found.")
616
+ req_data = dict(req_row)
617
+
618
+ # Load the system boundary
619
+ sys_row = conn.execute(
620
+ "SELECT * FROM ato_system_registry WHERE id = ?", (system_id,)
621
+ ).fetchone()
622
+ if not sys_row:
623
+ conn.close()
624
+ raise ValueError(f"System '{system_id}' not found in ato_system_registry.")
625
+ sys_data = dict(sys_row)
626
+
627
+ # Verify project matches
628
+ if sys_data["project_id"] != project_id:
629
+ conn.close()
630
+ raise ValueError(
631
+ f"System '{system_id}' belongs to project '{sys_data['project_id']}', "
632
+ f"not '{project_id}'."
633
+ )
634
+
635
+ # Build the text corpus for analysis
636
+ raw_text = req_data.get("raw_text", "")
637
+ refined_text = req_data.get("refined_text", "") or ""
638
+ full_text = f"{raw_text} {refined_text}".strip()
639
+ text_lower = full_text.lower()
640
+
641
+ # Score the impact
642
+ tier, score, category, description = _determine_impact_tier(text_lower, sys_data)
643
+
644
+ # Detect affected controls
645
+ affected_controls = _detect_affected_controls(text_lower)
646
+
647
+ # Detect affected SSP sections
648
+ affected_ssp_sections = _detect_affected_ssp_sections(text_lower)
649
+
650
+ # Always include Section 13 (architecture) for non-GREEN
651
+ if tier != "GREEN" and "Section 13 - System Architecture" not in affected_ssp_sections:
652
+ affected_ssp_sections.append("Section 13 - System Architecture")
653
+
654
+ # Generate remediation steps
655
+ remediation_steps = _generate_remediation_steps(
656
+ tier, category, affected_controls, affected_ssp_sections
657
+ )
658
+
659
+ # Build alternative approaches placeholder (populated only for RED)
660
+ alternative_approaches = []
661
+ if tier == "RED":
662
+ alternative_approaches = [
663
+ "Run generate_alternatives() for detailed COA analysis."
664
+ ]
665
+
666
+ # Create assessment ID
667
+ assessment_id = _generate_id("bia")
668
+ now = datetime.now(timezone.utc).isoformat()
669
+
670
+ # Insert into boundary_impact_assessments table
671
+ # Handle potential UNIQUE constraint (requirement_id, system_id)
672
+ try:
673
+ conn.execute(
674
+ """INSERT INTO boundary_impact_assessments
675
+ (id, project_id, system_id, requirement_id,
676
+ impact_tier, impact_category, impact_description,
677
+ affected_controls, affected_components, ssp_sections_impacted,
678
+ remediation_required, alternative_approach,
679
+ risk_score, assessed_by, assessed_at)
680
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)""",
681
+ (
682
+ assessment_id,
683
+ project_id,
684
+ system_id,
685
+ requirement_id,
686
+ tier,
687
+ category,
688
+ description,
689
+ json.dumps(affected_controls),
690
+ json.dumps([]), # affected_components — populated downstream
691
+ json.dumps(affected_ssp_sections),
692
+ json.dumps(remediation_steps),
693
+ json.dumps(alternative_approaches) if alternative_approaches else None,
694
+ float(score),
695
+ "boundary-analyzer",
696
+ now,
697
+ ),
698
+ )
699
+ conn.commit()
700
+ except sqlite3.IntegrityError:
701
+ # Assessment already exists for this requirement+system pair — update it
702
+ conn.execute(
703
+ """UPDATE boundary_impact_assessments
704
+ SET impact_tier = ?, impact_category = ?, impact_description = ?,
705
+ affected_controls = ?, ssp_sections_impacted = ?,
706
+ remediation_required = ?, alternative_approach = ?,
707
+ risk_score = ?, assessed_by = ?, assessed_at = ?
708
+ WHERE requirement_id = ? AND system_id = ?""",
709
+ (
710
+ tier, category, description,
711
+ json.dumps(affected_controls),
712
+ json.dumps(affected_ssp_sections),
713
+ json.dumps(remediation_steps),
714
+ json.dumps(alternative_approaches) if alternative_approaches else None,
715
+ float(score),
716
+ "boundary-analyzer", now,
717
+ requirement_id, system_id,
718
+ ),
719
+ )
720
+ # Retrieve the existing ID
721
+ existing = conn.execute(
722
+ "SELECT id FROM boundary_impact_assessments WHERE requirement_id = ? AND system_id = ?",
723
+ (requirement_id, system_id),
724
+ ).fetchone()
725
+ if existing:
726
+ assessment_id = existing["id"]
727
+ conn.commit()
728
+ finally:
729
+ conn.close()
730
+
731
+ if _HAS_AUDIT:
732
+ log_event(
733
+ event_type="boundary_impact_assessed",
734
+ actor="boundary-analyzer",
735
+ action=(
736
+ f"Assessed requirement {requirement_id} against system {system_id}: "
737
+ f"{tier} (score={score})"
738
+ ),
739
+ project_id=project_id,
740
+ details={
741
+ "assessment_id": assessment_id,
742
+ "tier": tier,
743
+ "score": score,
744
+ "affected_controls_count": len(affected_controls),
745
+ },
746
+ )
747
+
748
+ return {
749
+ "status": "ok",
750
+ "assessment_id": assessment_id,
751
+ "requirement_id": requirement_id,
752
+ "system_id": system_id,
753
+ "impact_tier": tier,
754
+ "impact_score": score,
755
+ "impact_category": category,
756
+ "impact_description": description,
757
+ "affected_controls": affected_controls,
758
+ "affected_ssp_sections": affected_ssp_sections,
759
+ "remediation_steps": remediation_steps,
760
+ "alternative_approaches": alternative_approaches if alternative_approaches else None,
761
+ }
762
+
763
+
764
+ # ---------------------------------------------------------------------------
765
+ # Alternative COA generation
766
+ # ---------------------------------------------------------------------------
767
+
768
+ def generate_alternatives(
769
+ project_id: str,
770
+ assessment_id: str,
771
+ db_path=None,
772
+ ) -> dict:
773
+ """Generate alternative COAs for RED-tier requirements.
774
+
775
+ Produces 3-4 alternatives that achieve the same mission intent within
776
+ the existing ATO or with minimal boundary disruption.
777
+
778
+ Args:
779
+ project_id: SPARKPILOT project ID.
780
+ assessment_id: Boundary impact assessment ID (must be RED tier).
781
+ db_path: Optional database path override.
782
+
783
+ Returns:
784
+ dict with assessment_id, requirement_id, original_tier, alternatives.
785
+ """
786
+ conn = get_connection(db_path=db_path)
787
+
788
+ # Load the assessment
789
+ bia_row = conn.execute(
790
+ "SELECT * FROM boundary_impact_assessments WHERE id = ?", (assessment_id,)
791
+ ).fetchone()
792
+ if not bia_row:
793
+ conn.close()
794
+ raise ValueError(f"Assessment '{assessment_id}' not found.")
795
+ bia_data = dict(bia_row)
796
+
797
+ if bia_data["project_id"] != project_id:
798
+ conn.close()
799
+ raise ValueError(
800
+ f"Assessment '{assessment_id}' belongs to project '{bia_data['project_id']}', "
801
+ f"not '{project_id}'."
802
+ )
803
+
804
+ if bia_data["impact_tier"] != "RED":
805
+ conn.close()
806
+ raise ValueError(
807
+ f"Assessment '{assessment_id}' is {bia_data['impact_tier']}, not RED. "
808
+ f"Alternatives are only generated for RED-tier impacts."
809
+ )
810
+
811
+ # Load the original requirement for context
812
+ req_id = bia_data.get("requirement_id")
813
+ req_text = ""
814
+ if req_id:
815
+ req_row = conn.execute(
816
+ "SELECT raw_text, refined_text, requirement_type FROM intake_requirements WHERE id = ?",
817
+ (req_id,),
818
+ ).fetchone()
819
+ if req_row:
820
+ req_data = dict(req_row)
821
+ req_text = (req_data.get("raw_text", "") + " " +
822
+ (req_data.get("refined_text", "") or "")).strip()
823
+
824
+ text_lower = req_text.lower()
825
+
826
+ # Parse affected controls from assessment
827
+ affected_controls_raw = bia_data.get("affected_controls", "[]")
828
+ try:
829
+ affected_controls = json.loads(affected_controls_raw) if isinstance(
830
+ affected_controls_raw, str) else affected_controls_raw or []
831
+ except (json.JSONDecodeError, TypeError):
832
+ affected_controls = []
833
+
834
+ # Load system data for context
835
+ sys_row = conn.execute(
836
+ "SELECT * FROM ato_system_registry WHERE id = ?", (bia_data["system_id"],)
837
+ ).fetchone()
838
+ sys_data = dict(sys_row) if sys_row else {}
839
+ system_level = sys_data.get("impact_level", "IL5")
840
+
841
+ # --- Generate alternatives ---
842
+ alternatives = []
843
+
844
+ # Alternative 1: Cross-Domain Solution (CDS)
845
+ cds_controls = list(set(affected_controls) | {"AC-4", "SC-7", "CA-3"})
846
+ cds_feasibility = 0.6
847
+ cds_tradeoffs = [
848
+ "Requires approved CDS product (e.g., ISSE Guard, Radiant Mercury).",
849
+ "Adds latency to data transfers.",
850
+ "Procurement timeline: 6-12 months for CDS approval.",
851
+ "Ongoing CDS maintenance and patching burden.",
852
+ ]
853
+ if any(kw in text_lower for kw in ["secret", "ts/sci", "top secret"]):
854
+ cds_feasibility = 0.7
855
+ cds_tradeoffs.append(
856
+ "CDS is the standard approach for cross-classification data sharing."
857
+ )
858
+ alternatives.append({
859
+ "approach_name": "Cross-Domain Solution (CDS)",
860
+ "description": (
861
+ "Use an approved Cross-Domain Solution to mediate data exchange between "
862
+ f"the {system_level} boundary and the higher-classification requirement. "
863
+ "Data flows through the CDS with content inspection, filtering, and "
864
+ "audit logging. The existing ATO boundary remains intact."
865
+ ),
866
+ "boundary_tier_after": "YELLOW",
867
+ "feasibility_score": round(cds_feasibility, 2),
868
+ "tradeoffs": cds_tradeoffs,
869
+ "affected_controls": sorted(cds_controls),
870
+ })
871
+
872
+ # Alternative 2: Data Downgrade
873
+ downgrade_controls = list(set(affected_controls) | {"SC-8", "SC-28", "AC-3"})
874
+ downgrade_feasibility = 0.5
875
+ downgrade_tradeoffs = [
876
+ "Some data fidelity may be lost during downgrade/sanitization.",
877
+ "Requires formal data review and sanitization procedures.",
878
+ "Aggregation at higher level may introduce delays.",
879
+ "Must establish and maintain downgrade approval authority.",
880
+ ]
881
+ if "classification" in text_lower or "secret" in text_lower:
882
+ downgrade_feasibility = 0.4
883
+ downgrade_tradeoffs.append(
884
+ "Classification downgrade requires formal review by Original Classification Authority (OCA)."
885
+ )
886
+ alternatives.append({
887
+ "approach_name": "Data Downgrade / Sanitization",
888
+ "description": (
889
+ f"Process data at {system_level} (current boundary level) after sanitization "
890
+ "or downgrade. Higher-classification aggregation occurs on a separate "
891
+ "authorized system. Only downgraded/sanitized results flow into the "
892
+ "current boundary."
893
+ ),
894
+ "boundary_tier_after": "GREEN",
895
+ "feasibility_score": round(downgrade_feasibility, 2),
896
+ "tradeoffs": downgrade_tradeoffs,
897
+ "affected_controls": sorted(downgrade_controls),
898
+ })
899
+
900
+ # Alternative 3: Phased Approach
901
+ phased_controls = list(set(affected_controls) | {"CM-3", "CA-2"})
902
+ phased_feasibility = 0.75
903
+ phased_tradeoffs = [
904
+ "Full capability delivered incrementally, not all at once.",
905
+ "Phase 1 (GREEN/YELLOW) can begin immediately.",
906
+ "Phase 2+ requires separate authorization action.",
907
+ "Must maintain phase boundary documentation.",
908
+ ]
909
+ alternatives.append({
910
+ "approach_name": "Phased Implementation",
911
+ "description": (
912
+ "Split the requirement into phases. Phase 1 implements functionality "
913
+ "that fits within the current ATO boundary (GREEN/YELLOW tier). "
914
+ "Phase 2 addresses cross-boundary or classification changes through "
915
+ "a separate authorization action, running in parallel without blocking "
916
+ "Phase 1 delivery."
917
+ ),
918
+ "boundary_tier_after": "YELLOW",
919
+ "feasibility_score": round(phased_feasibility, 2),
920
+ "tradeoffs": phased_tradeoffs,
921
+ "affected_controls": sorted(phased_controls),
922
+ })
923
+
924
+ # Alternative 4: Proxy Pattern
925
+ proxy_controls = list(set(affected_controls) | {"SA-9", "CA-3", "SC-7"})
926
+ proxy_feasibility = 0.65
927
+ proxy_tradeoffs = [
928
+ "Dependent on an existing authorized intermediary system.",
929
+ "Adds an additional hop in the data path (latency).",
930
+ "Must establish ISA/MOU with the intermediary system owner.",
931
+ "Intermediary system must have sufficient ATO scope.",
932
+ ]
933
+ if any(kw in text_lower for kw in ["external", "third-party", "vendor"]):
934
+ proxy_feasibility = 0.7
935
+ proxy_tradeoffs.append(
936
+ "Existing API gateways or ESBs may serve as the authorized intermediary."
937
+ )
938
+ alternatives.append({
939
+ "approach_name": "Proxy Pattern (Authorized Intermediary)",
940
+ "description": (
941
+ "Route the requirement through an existing authorized system that "
942
+ "already has the necessary boundary scope. The intermediary handles "
943
+ "cross-boundary or cross-classification mediation. The current system "
944
+ "connects only to the authorized intermediary via an approved "
945
+ "interconnection (ISA/MOU), keeping the existing ATO intact."
946
+ ),
947
+ "boundary_tier_after": "ORANGE",
948
+ "feasibility_score": round(proxy_feasibility, 2),
949
+ "tradeoffs": proxy_tradeoffs,
950
+ "affected_controls": sorted(proxy_controls),
951
+ })
952
+
953
+ # Update the assessment with alternatives
954
+ conn.execute(
955
+ """UPDATE boundary_impact_assessments
956
+ SET alternative_approach = ?, assessed_at = ?
957
+ WHERE id = ?""",
958
+ (json.dumps(alternatives), datetime.now(timezone.utc).isoformat(), assessment_id),
959
+ )
960
+ conn.commit()
961
+ conn.close()
962
+
963
+ if _HAS_AUDIT:
964
+ log_event(
965
+ event_type="alternatives_generated",
966
+ actor="boundary-analyzer",
967
+ action=(
968
+ f"Generated {len(alternatives)} alternative COAs for assessment {assessment_id}"
969
+ ),
970
+ project_id=project_id,
971
+ details={
972
+ "assessment_id": assessment_id,
973
+ "requirement_id": req_id,
974
+ "alternative_count": len(alternatives),
975
+ },
976
+ )
977
+
978
+ return {
979
+ "status": "ok",
980
+ "assessment_id": assessment_id,
981
+ "requirement_id": req_id,
982
+ "original_tier": "RED",
983
+ "alternatives": alternatives,
984
+ }
985
+
986
+
987
+ # ---------------------------------------------------------------------------
988
+ # Listing
989
+ # ---------------------------------------------------------------------------
990
+
991
+ def list_assessments(
992
+ project_id: str,
993
+ system_id: str = None,
994
+ tier: str = None,
995
+ db_path=None,
996
+ ) -> dict:
997
+ """List all boundary assessments, optionally filtered by system or tier.
998
+
999
+ Args:
1000
+ project_id: SPARKPILOT project ID.
1001
+ system_id: Optional filter by ATO system.
1002
+ tier: Optional filter by tier (GREEN, YELLOW, ORANGE, RED).
1003
+ db_path: Optional database path override.
1004
+
1005
+ Returns:
1006
+ dict with assessments list and summary counts.
1007
+ """
1008
+ if tier and tier not in ("GREEN", "YELLOW", "ORANGE", "RED"):
1009
+ raise ValueError(
1010
+ f"Invalid tier '{tier}'. Must be one of: GREEN, YELLOW, ORANGE, RED"
1011
+ )
1012
+
1013
+ conn = get_connection(db_path=db_path)
1014
+
1015
+ query = "SELECT * FROM boundary_impact_assessments WHERE project_id = ?"
1016
+ params = [project_id]
1017
+
1018
+ if system_id:
1019
+ query += " AND system_id = ?"
1020
+ params.append(system_id)
1021
+
1022
+ if tier:
1023
+ query += " AND impact_tier = ?"
1024
+ params.append(tier)
1025
+
1026
+ query += " ORDER BY assessed_at DESC"
1027
+
1028
+ rows = conn.execute(query, params).fetchall()
1029
+ conn.close()
1030
+
1031
+ assessments = []
1032
+ tier_counts = {"GREEN": 0, "YELLOW": 0, "ORANGE": 0, "RED": 0}
1033
+
1034
+ for r in rows:
1035
+ d = dict(r)
1036
+ t = d.get("impact_tier", "GREEN")
1037
+ if t in tier_counts:
1038
+ tier_counts[t] += 1
1039
+
1040
+ # Parse JSON fields for output
1041
+ for field in ("affected_controls", "affected_components",
1042
+ "ssp_sections_impacted", "remediation_required",
1043
+ "alternative_approach"):
1044
+ val = d.get(field)
1045
+ if val and isinstance(val, str):
1046
+ try:
1047
+ d[field] = json.loads(val)
1048
+ except (json.JSONDecodeError, TypeError):
1049
+ pass
1050
+
1051
+ assessments.append(d)
1052
+
1053
+ return {
1054
+ "status": "ok",
1055
+ "project_id": project_id,
1056
+ "system_id": system_id,
1057
+ "tier_filter": tier,
1058
+ "total_assessments": len(assessments),
1059
+ "tier_counts": tier_counts,
1060
+ "assessments": assessments,
1061
+ }
1062
+
1063
+
1064
+ # ---------------------------------------------------------------------------
1065
+ # CLI
1066
+ # ---------------------------------------------------------------------------
1067
+
1068
+ def main():
1069
+ parser = argparse.ArgumentParser(
1070
+ description="SPARKPILOT ATO Boundary Impact Analyzer (4-tier GREEN/YELLOW/ORANGE/RED)"
1071
+ )
1072
+ parser.add_argument("--project-id", required=True, help="SPARKPILOT project ID")
1073
+
1074
+ # System registration
1075
+ parser.add_argument("--register-system", action="store_true",
1076
+ help="Register a new ATO system boundary")
1077
+ parser.add_argument("--system-name", help="System name (for registration)")
1078
+ parser.add_argument("--ato-status",
1079
+ choices=["active", "provisional", "expired", "pending"],
1080
+ default="active", help="ATO status")
1081
+ parser.add_argument("--classification", default="CUI",
1082
+ help="Classification marking")
1083
+ parser.add_argument("--impact-level",
1084
+ choices=["IL2", "IL4", "IL5", "IL6"],
1085
+ default="IL5", help="Impact level")
1086
+ parser.add_argument("--boundary-definition", help="JSON boundary definition")
1087
+ parser.add_argument("--baseline-controls", help="Comma-separated control IDs")
1088
+ parser.add_argument("--ato-expiry", help="ATO expiry date (ISO format)")
1089
+ parser.add_argument("--isso-name", help="ISSO point of contact name")
1090
+ parser.add_argument("--isso-email", help="ISSO point of contact email")
1091
+
1092
+ # Assessment
1093
+ parser.add_argument("--system-id", help="ATO system ID (for assessment)")
1094
+ parser.add_argument("--requirement-id", help="Requirement ID to assess")
1095
+
1096
+ # Alternatives
1097
+ parser.add_argument("--generate-alternatives", action="store_true",
1098
+ help="Generate alternative COAs for RED assessment")
1099
+ parser.add_argument("--assessment-id", help="Assessment ID (for alternatives)")
1100
+
1101
+ # Listing
1102
+ parser.add_argument("--list-systems", action="store_true",
1103
+ help="List all registered ATO systems")
1104
+ parser.add_argument("--list-assessments", action="store_true",
1105
+ help="List boundary impact assessments")
1106
+ parser.add_argument("--tier",
1107
+ choices=["GREEN", "YELLOW", "ORANGE", "RED"],
1108
+ help="Filter assessments by tier")
1109
+ parser.add_argument("--get-system", action="store_true",
1110
+ help="Get system details")
1111
+
1112
+ # Output
1113
+ parser.add_argument("--json", action="store_true", help="JSON output")
1114
+
1115
+ args = parser.parse_args()
1116
+
1117
+ try:
1118
+ result = None
1119
+
1120
+ if args.register_system:
1121
+ if not args.system_name:
1122
+ parser.error("--system-name is required for --register-system")
1123
+
1124
+ boundary_def = None
1125
+ if args.boundary_definition:
1126
+ try:
1127
+ boundary_def = json.loads(args.boundary_definition)
1128
+ except json.JSONDecodeError as e:
1129
+ parser.error(f"Invalid JSON for --boundary-definition: {e}")
1130
+
1131
+ controls = []
1132
+ if args.baseline_controls:
1133
+ controls = [c.strip() for c in args.baseline_controls.split(",")
1134
+ if c.strip()]
1135
+
1136
+ result = register_system(
1137
+ project_id=args.project_id,
1138
+ system_name=args.system_name,
1139
+ ato_status=args.ato_status,
1140
+ boundary_definition=boundary_def,
1141
+ baseline_controls=controls,
1142
+ classification=args.classification,
1143
+ impact_level=args.impact_level,
1144
+ ato_expiry_date=args.ato_expiry,
1145
+ isso_name=args.isso_name,
1146
+ isso_email=args.isso_email,
1147
+ )
1148
+
1149
+ elif args.system_id and args.requirement_id:
1150
+ result = assess_boundary_impact(
1151
+ project_id=args.project_id,
1152
+ system_id=args.system_id,
1153
+ requirement_id=args.requirement_id,
1154
+ )
1155
+
1156
+ elif args.generate_alternatives:
1157
+ if not args.assessment_id:
1158
+ parser.error("--assessment-id is required for --generate-alternatives")
1159
+ result = generate_alternatives(
1160
+ project_id=args.project_id,
1161
+ assessment_id=args.assessment_id,
1162
+ )
1163
+
1164
+ elif args.list_systems:
1165
+ result = list_systems(project_id=args.project_id)
1166
+
1167
+ elif args.list_assessments:
1168
+ result = list_assessments(
1169
+ project_id=args.project_id,
1170
+ system_id=args.system_id,
1171
+ tier=args.tier,
1172
+ )
1173
+
1174
+ elif args.get_system and args.system_id:
1175
+ result = get_system(system_id=args.system_id)
1176
+
1177
+ else:
1178
+ parser.print_help()
1179
+ return
1180
+
1181
+ if args.json:
1182
+ print(json.dumps(result, indent=2, default=str))
1183
+ else:
1184
+ _print_human_readable(result)
1185
+
1186
+ except (ValueError, FileNotFoundError) as e:
1187
+ if args.json:
1188
+ print(json.dumps({"error": str(e)}, indent=2))
1189
+ else:
1190
+ print(f"Error: {e}")
1191
+ raise SystemExit(1)
1192
+
1193
+
1194
+ def _print_human_readable(result: dict):
1195
+ """Print result in human-readable format."""
1196
+ if not result:
1197
+ return
1198
+
1199
+ result.get("status", "unknown")
1200
+
1201
+ # Registration result
1202
+ if "system_id" in result and "baseline_controls_count" in result:
1203
+ print(f"System registered: {result.get('system_name')}")
1204
+ print(f" ID: {result.get('system_id')}")
1205
+ print(f" ATO Status: {result.get('ato_status')}")
1206
+ print(f" Baseline Controls: {result.get('baseline_controls_count')}")
1207
+ return
1208
+
1209
+ # Assessment result
1210
+ if "impact_tier" in result and "impact_score" in result:
1211
+ tier = result["impact_tier"]
1212
+ score = result["impact_score"]
1213
+ print(f"[{tier}] Impact Score: {score}/100")
1214
+ print(f" Requirement: {result.get('requirement_id')}")
1215
+ print(f" Category: {result.get('impact_category')}")
1216
+ print(f" Description: {result.get('impact_description')}")
1217
+ controls = result.get("affected_controls", [])
1218
+ if controls:
1219
+ print(f" Affected Controls: {', '.join(controls)}")
1220
+ sections = result.get("affected_ssp_sections", [])
1221
+ if sections:
1222
+ print(" Affected SSP Sections:")
1223
+ for s in sections:
1224
+ print(f" - {s}")
1225
+ steps = result.get("remediation_steps", [])
1226
+ if steps:
1227
+ print(" Remediation Steps:")
1228
+ for i, step in enumerate(steps, 1):
1229
+ print(f" {i}. {step}")
1230
+ return
1231
+
1232
+ # Alternatives result
1233
+ if "alternatives" in result and "original_tier" in result:
1234
+ print(f"Alternatives for assessment {result.get('assessment_id')}:")
1235
+ print(f" Original Tier: {result.get('original_tier')}")
1236
+ for alt in result.get("alternatives", []):
1237
+ print(f"\n [{alt.get('boundary_tier_after')}] {alt.get('approach_name')}")
1238
+ print(f" Feasibility: {alt.get('feasibility_score', 0):.0%}")
1239
+ print(f" {alt.get('description')}")
1240
+ if alt.get("tradeoffs"):
1241
+ print(" Tradeoffs:")
1242
+ for t in alt["tradeoffs"]:
1243
+ print(f" - {t}")
1244
+ return
1245
+
1246
+ # System list
1247
+ if "systems" in result:
1248
+ print(f"ATO Systems ({result.get('system_count', 0)}):")
1249
+ for sys in result.get("systems", []):
1250
+ print(f" {sys.get('id')}: {sys.get('system_name')} "
1251
+ f"[{sys.get('ato_status', 'unknown')}] ({sys.get('impact_level')})")
1252
+ return
1253
+
1254
+ # Assessment list
1255
+ if "assessments" in result:
1256
+ counts = result.get("tier_counts", {})
1257
+ print(f"Boundary Assessments ({result.get('total_assessments', 0)}):")
1258
+ print(f" GREEN={counts.get('GREEN', 0)} YELLOW={counts.get('YELLOW', 0)} "
1259
+ f"ORANGE={counts.get('ORANGE', 0)} RED={counts.get('RED', 0)}")
1260
+ for a in result.get("assessments", []):
1261
+ print(f" [{a.get('impact_tier')}] {a.get('id')} — "
1262
+ f"req={a.get('requirement_id')} score={a.get('risk_score')}")
1263
+ return
1264
+
1265
+ # System details
1266
+ if "system" in result:
1267
+ sys = result["system"]
1268
+ print(f"System: {sys.get('system_name')}")
1269
+ print(f" ID: {sys.get('id')}")
1270
+ print(f" Type: {sys.get('ato_type')}")
1271
+ print(f" Impact Level: {sys.get('impact_level')}")
1272
+ print(f" Classification: {sys.get('classification')}")
1273
+ return
1274
+
1275
+ # Fallback
1276
+ print(json.dumps(result, indent=2, default=str))
1277
+
1278
+
1279
+ if __name__ == "__main__":
1280
+ main()
1281
+ # [TEMPLATE: CUI // SP-CTI]