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.
- args/agent_config.yaml +113 -0
- args/audit_regimes/cisa_sbd.json +381 -0
- args/audit_regimes/cmmc_l2.json +906 -0
- args/audit_regimes/dod_cssp.json +393 -0
- args/audit_regimes/dodi_5000_87.json +297 -0
- args/audit_regimes/fedramp_moderate.json +650 -0
- args/audit_regimes/ieee_1012.json +373 -0
- args/audit_regimes/nist_800_171.json +624 -0
- args/audit_regimes/nist_800_53.json +907 -0
- args/cloudforge_blueprints/aws_commercial.yaml +29 -0
- args/cloudforge_blueprints/aws_govcloud_il4.yaml +34 -0
- args/cloudforge_blueprints/aws_govcloud_il5.yaml +38 -0
- args/cloudforge_blueprints/azure_commercial.yaml +28 -0
- args/cloudforge_blueprints/azure_gov_il4.yaml +32 -0
- args/cloudforge_blueprints/azure_gov_il5.yaml +36 -0
- args/cloudforge_blueprints/gcp_commercial.yaml +28 -0
- args/cloudforge_blueprints/oci_commercial.yaml +28 -0
- args/cloudforge_config.yaml +231 -0
- args/cloudforge_runbook_templates/backup_verify.yaml +98 -0
- args/cloudforge_runbook_templates/dr_failover.yaml +107 -0
- args/cloudforge_runbook_templates/health_check.yaml +97 -0
- args/cloudforge_runbook_templates/incident_response.yaml +101 -0
- args/cloudforge_runbook_templates/migration_cutover.yaml +105 -0
- args/cloudforge_runbook_templates/patch_rollout.yaml +92 -0
- args/cloudforge_runbook_templates/zone_provision.yaml +93 -0
- args/code_pattern_config.yaml +151 -0
- args/code_quality_config.yaml +47 -0
- args/compliance_config.yaml +17 -0
- args/control_inheritance.yaml +177 -0
- args/csp_mcp_config.yaml +41 -0
- args/cui_markings.yaml +35 -0
- args/databridge_config.yaml +232 -0
- args/db_config.yaml +116 -0
- args/decision_tables/agent_trust_decision.yaml +143 -0
- args/decision_tables/ato_boundary_impact.yaml +132 -0
- args/decision_tables/deployment_approval.yaml +152 -0
- args/degradation_matrix.yaml +163 -0
- args/devsecops_config.yaml +286 -0
- args/endpoint_security_config.yaml +207 -0
- args/exit_criteria.yaml +102 -0
- args/feature_flags.yaml +235 -0
- args/file_access_tiers.yaml +88 -0
- args/forge_studio/blueprint_config.yaml +27 -0
- args/forge_studio/component_catalog.json +411 -0
- args/forge_studio/workflow_templates.yaml +103 -0
- args/govcon_config.yaml +41 -0
- args/harness_config.yaml +67 -0
- args/innovation_config.yaml +321 -0
- args/knowledge_graph_config.yaml +113 -0
- args/llm_config.yaml +222 -0
- args/marketplace_config.yaml +260 -0
- args/monitoring_config.yaml +127 -0
- args/mosa_config.yaml +190 -0
- args/observability_tracing_config.yaml +170 -0
- args/owasp_agentic_config.yaml +171 -0
- args/pipeline_gates.yaml +197 -0
- args/project_defaults.yaml +235 -0
- args/prompt_chains.yaml +163 -0
- args/rag_config.yaml +167 -0
- args/research_config.yaml +89 -0
- args/resilience_config.yaml +197 -0
- args/ricoas_config.yaml +191 -0
- args/security_gates.yaml +763 -0
- args/storage_config.yaml +63 -0
- args/writeguard_config.yaml +131 -0
- args/zta_config.yaml +247 -0
- context/__init__.py +6 -0
- context/agent/__init__.py +6 -0
- context/agent/response_schemas/__init__.py +6 -0
- context/agent/response_schemas/debate_position.json +46 -0
- context/agent/response_schemas/fitness_scorecard.json +74 -0
- context/agent/response_schemas/review_decision.json +39 -0
- context/agent/response_schemas/task_decomposition.json +82 -0
- context/agent/response_schemas/veto_decision.json +40 -0
- context/agentic/__init__.py +6 -0
- context/agentic/architecture_patterns.md +269 -0
- context/agentic/capability_registry.yaml +223 -0
- context/agentic/csp_integration.md +30 -0
- context/agentic/csp_mcp_registry.yaml +280 -0
- context/agentic/fitness_rubric.md +56 -0
- context/agentic/governance_baseline.md +205 -0
- context/ci/__init__.py +6 -0
- context/ci/worktree_templates.json +44 -0
- context/cloud/__init__.py +6 -0
- context/cloud/csp_service_registry.json +739 -0
- context/compliance/__init__.py +6 -0
- context/compliance/ai_rmf_crosswalk.yaml +226 -0
- context/compliance/atlas_mitigations.json +293 -0
- context/compliance/atlas_techniques.json +833 -0
- context/compliance/cisa_sbd_requirements.json +477 -0
- context/compliance/cjis_security_policy.json +522 -0
- context/compliance/cmmc_practices.json +2494 -0
- context/compliance/cmmc_report_template.md +142 -0
- context/compliance/cnssi_1253_overlay.json +109 -0
- context/compliance/control_crosswalk.json +1914 -0
- context/compliance/control_families/__init__.py +6 -0
- context/compliance/csp_certifications.json +251 -0
- context/compliance/cssp_report_template.md +193 -0
- context/compliance/cui_templates/__init__.py +6 -0
- context/compliance/cui_templates/banner_block.txt +4 -0
- context/compliance/cui_templates/code_header.txt +8 -0
- context/compliance/cui_templates/document_template.md +35 -0
- context/compliance/data_type_framework_map.json +321 -0
- context/compliance/data_type_registry.json +147 -0
- context/compliance/dod_cssp_8530.json +463 -0
- context/compliance/eu_ai_act_annex_iii.json +108 -0
- context/compliance/export_templates/__init__.py +6 -0
- context/compliance/export_templates/emass_controls.csv.j2 +4 -0
- context/compliance/export_templates/evidence_package.md.j2 +39 -0
- context/compliance/export_templates/executive_summary.md.j2 +55 -0
- context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
- context/compliance/fedramp_20x_ksi_schemas.json +133 -0
- context/compliance/fedramp_high_baseline.json +4370 -0
- context/compliance/fedramp_moderate_baseline.json +2183 -0
- context/compliance/fedramp_report_template.md +181 -0
- context/compliance/fips_200_areas.json +362 -0
- context/compliance/gao_ai_accountability.json +262 -0
- context/compliance/hipaa_security_rule.json +720 -0
- context/compliance/hitrust_csf_v11.json +930 -0
- context/compliance/impact_level_profiles.json +251 -0
- context/compliance/incident_response_template.md +1110 -0
- context/compliance/iso27001_2022_controls.json +750 -0
- context/compliance/iso27001_nist_bridge.json +382 -0
- context/compliance/iso42001_controls.json +254 -0
- context/compliance/ivv_checklist_template.md +80 -0
- context/compliance/ivv_report_template.md +116 -0
- context/compliance/ivv_requirements.json +372 -0
- context/compliance/mosa_crosswalk.json +327 -0
- context/compliance/mosa_framework.json +250 -0
- context/compliance/narrative_templates/AC.md.j2 +101 -0
- context/compliance/narrative_templates/AU.md.j2 +106 -0
- context/compliance/narrative_templates/IA.md.j2 +104 -0
- context/compliance/narrative_templates/SC.md.j2 +102 -0
- context/compliance/narrative_templates/SI.md.j2 +111 -0
- context/compliance/narrative_templates/__init__.py +6 -0
- context/compliance/narrative_templates/default.md.j2 +50 -0
- context/compliance/narrative_templates/executive_summary.j2 +27 -0
- context/compliance/narrative_templates/poam_milestone.j2 +19 -0
- context/compliance/narrative_templates/ssp_section.j2 +11 -0
- context/compliance/nist_800_171_controls.json +1552 -0
- context/compliance/nist_800_207_crosswalk.json +399 -0
- context/compliance/nist_800_207_zta.json +258 -0
- context/compliance/nist_800_53.json +324 -0
- context/compliance/nist_ai_600_1_genai.json +326 -0
- context/compliance/nist_ai_rmf.json +206 -0
- context/compliance/nist_sp_800_60_types.json +1667 -0
- context/compliance/omb_m25_21_high_impact_ai.json +248 -0
- context/compliance/omb_m26_04_unbiased_ai.json +262 -0
- context/compliance/owasp_agentic_asi.json +133 -0
- context/compliance/owasp_agentic_threats.json +285 -0
- context/compliance/owasp_llm_top10.json +274 -0
- context/compliance/pci_dss_v4.json +510 -0
- context/compliance/poam_template.md +117 -0
- context/compliance/safeai_controls.json +512 -0
- context/compliance/sbd_report_template.md +77 -0
- context/compliance/siem_config_templates/__init__.py +6 -0
- context/compliance/siem_config_templates/filebeat.yml +213 -0
- context/compliance/siem_config_templates/log_sources.json +208 -0
- context/compliance/soc2_trust_criteria.json +661 -0
- context/compliance/ssp_template.md +432 -0
- context/compliance/stig_templates/__init__.py +6 -0
- context/compliance/stig_templates/webapp_stig.json +139 -0
- context/compliance/xai_requirements.json +108 -0
- context/dashboard/__init__.py +6 -0
- context/dashboard/nlq_examples.json +50 -0
- context/dashboard/schema_descriptions.json +23 -0
- context/icdev_methodology.md +100 -0
- context/integration/__init__.py +6 -0
- context/integration/approval_workflows.json +32 -0
- context/integration/gitlab_field_mappings.json +33 -0
- context/integration/jira_field_mappings.json +32 -0
- context/integration/reqif_export_schema.json +23 -0
- context/integration/servicenow_field_mappings.json +22 -0
- context/languages/__init__.py +6 -0
- context/languages/framework_patterns.json +205 -0
- context/languages/language_registry.json +279 -0
- context/llm/__init__.py +6 -0
- context/llm/example_provider.py +89 -0
- context/marketplace/assets/writeguard-core.yaml +100 -0
- context/marketplace/assets/writeguard-govcon.yaml +45 -0
- context/marketplace/assets/writeguard-style-guides.yaml +44 -0
- context/mbse/__init__.py +6 -0
- context/mbse/des_report_template.md +162 -0
- context/mbse/des_requirements.json +411 -0
- context/mbse/digital_thread_patterns.json +403 -0
- context/mbse/reqif_schema.json +280 -0
- context/mbse/sysml_element_types.json +432 -0
- context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
- context/oscal/README.md +43 -0
- context/patterns/__init__.py +6 -0
- context/profiles/__init__.py +6 -0
- context/profiles/dod_baseline_v1.yaml +145 -0
- context/profiles/fedramp_baseline_v1.yaml +143 -0
- context/profiles/financial_baseline_v1.yaml +142 -0
- context/profiles/healthcare_baseline_v1.yaml +135 -0
- context/profiles/law_enforcement_v1.yaml +129 -0
- context/profiles/startup_v1.yaml +134 -0
- context/rag/source_mappings.json +42 -0
- context/requirements/__init__.py +6 -0
- context/requirements/ambiguity_patterns.json +97 -0
- context/requirements/boundary_impact_rules.json +123 -0
- context/requirements/default_constitutions.json +67 -0
- context/requirements/document_extraction_rules.json +58 -0
- context/requirements/gap_patterns.json +108 -0
- context/requirements/readiness_rubric.json +78 -0
- context/requirements/red_alternative_patterns.json +210 -0
- context/requirements/safe_templates.json +72 -0
- context/requirements/spec_quality_checklist.json +122 -0
- context/research/regulatory_registry.json +114 -0
- context/research/verticals/cybersecurity.json +127 -0
- context/research/verticals/defense.json +104 -0
- context/research/verticals/fintech.json +125 -0
- context/research/verticals/healthcare.json +118 -0
- context/research/verticals/logistics.json +117 -0
- context/research/verticals/trading.json +145 -0
- context/simulation/__init__.py +6 -0
- context/simulation/architecture_patterns.json +36 -0
- context/simulation/coa_templates.json +38 -0
- context/simulation/cost_models.json +23 -0
- context/simulation/risk_categories.json +46 -0
- context/supply_chain/__init__.py +6 -0
- context/supply_chain/isa_templates.json +129 -0
- context/supply_chain/nist_800_161_controls.json +247 -0
- context/supply_chain/scrm_risk_matrix.json +147 -0
- context/templates/__init__.py +6 -0
- context/templates/ansible/__init__.py +6 -0
- context/templates/ansible/playbooks/__init__.py +6 -0
- context/templates/ansible/roles/__init__.py +6 -0
- context/templates/gitlab_ci/__init__.py +6 -0
- context/templates/grafana/__init__.py +6 -0
- context/templates/kubernetes/__init__.py +6 -0
- context/templates/project/__init__.py +6 -0
- context/templates/project/api/__init__.py +6 -0
- context/templates/project/cli/__init__.py +6 -0
- context/templates/project/data_pipeline/__init__.py +6 -0
- context/templates/project/iac/__init__.py +6 -0
- context/templates/project/javascript_frontend/__init__.py +6 -0
- context/templates/project/javascript_frontend/src/__init__.py +6 -0
- context/templates/project/javascript_frontend/tests/__init__.py +6 -0
- context/templates/project/microservice/__init__.py +6 -0
- context/templates/project/python_backend/__init__.py +6 -0
- context/templates/project/python_backend/src/__init__.py +6 -0
- context/templates/project/python_backend/tests/__init__.py +6 -0
- context/templates/project/python_backend/tests/features/__init__.py +6 -0
- context/templates/project/python_backend/tests/steps/__init__.py +6 -0
- context/templates/terraform/__init__.py +6 -0
- context/templates/terraform/govcloud_base/__init__.py +6 -0
- context/templates/terraform/modules/__init__.py +6 -0
- context/tone/__init__.py +6 -0
- context/writing/grammar_rules/common_errors.json +306 -0
- context/writing/grammar_rules/govcon_vocabulary.json +113 -0
- context/writing/style_guides/academic.yaml +43 -0
- context/writing/style_guides/business.yaml +42 -0
- context/writing/style_guides/government.yaml +59 -0
- context/writing/style_guides/proposal.yaml +58 -0
- context/writing/style_guides/technical.yaml +43 -0
- docs/adr/README.md +66 -0
- docs/adr/connector-forge-decisions.md +318 -0
- docs/adr/core-decisions.md +289 -0
- docs/adr/db-decisions.md +94 -0
- docs/adr/harness-decisions.md +122 -0
- docs/adr/innovation-decisions.md +262 -0
- docs/adr/marketplace-decisions.md +109 -0
- docs/adr/sbd-decisions.md +109 -0
- docs/adr/scale-engine-decisions.md +108 -0
- docs/adr/writeguard-decisions.md +136 -0
- docs/architecture/bounded-contexts.md +1032 -0
- docs/features/phase-65-writeguard.md +139 -0
- docs/features/phase-66-marketplace-commerce.md +79 -0
- docs/features/phase-67-knowledge-ingestion-rag-autodraft.md +97 -0
- docs/features/phase-68-enhanced-autodraft-pipeline.md +109 -0
- docs/features/phase-69-proposalai-marketplace-module.md +131 -0
- docs/features/phase-70-databridge.md +214 -0
- docs/features/phase-71-databridge-messaging.md +102 -0
- docs/implementation-plan-architecture-evolution.md +614 -0
- docs/marketplace/CONTRIBUTING.md +124 -0
- docs/marketplace/module_manifest_schema.yaml +83 -0
- docs/research/ai-architecture-patterns-2024-2026.md +1236 -0
- docs/research/app-builder-platform-analysis.md +582 -0
- docs/research/architecture-patterns-c4-ddd-agentic.md +871 -0
- docs/research/flowable-boat-competitive-analysis.md +426 -0
- docs/research/modern-dev-practices-2024-2026.md +1615 -0
- docs/research/secure-by-design-cloudyrion-adaptation.md +270 -0
- goals/agent_management.md +144 -0
- goals/ai_accountability.md +90 -0
- goals/ai_narratives.md +79 -0
- goals/ai_transparency.md +76 -0
- goals/ato_simulator.md +78 -0
- goals/audit_engine.md +177 -0
- goals/bite_sized_plans.md +225 -0
- goals/boundary_supply_chain.md +206 -0
- goals/brainstorming_gate.md +186 -0
- goals/build_app.md +604 -0
- goals/cato_live_evidence.md +77 -0
- goals/cloudforge.md +106 -0
- goals/code_intelligence.md +197 -0
- goals/compliance_workflow.md +858 -0
- goals/connector_forge.md +133 -0
- goals/databridge.md +128 -0
- goals/deploy_workflow.md +390 -0
- goals/developer_scorecard.md +78 -0
- goals/devsecops_workflow.md +408 -0
- goals/firmware_sbom.md +79 -0
- goals/forge_hub.md +78 -0
- goals/golden_path.md +77 -0
- goals/harness_engineering.md +91 -0
- goals/integration_testing.md +189 -0
- goals/knowledge_graph.md +128 -0
- goals/maintenance_audit.md +196 -0
- goals/manifest.md +50 -0
- goals/monitoring.md +126 -0
- goals/mosa_workflow.md +463 -0
- goals/multi_agent_orchestration.md +68 -0
- goals/observability_traceability_xai.md +154 -0
- goals/owasp_agentic_security.md +395 -0
- goals/pr_intelligence.md +78 -0
- goals/requirements_intake.md +213 -0
- goals/secure_by_design.md +135 -0
- goals/security_scan.md +381 -0
- goals/self_healing.md +120 -0
- goals/simulation_engine.md +111 -0
- goals/subagent_review.md +205 -0
- goals/systematic_debugging.md +257 -0
- goals/tdd_workflow.md +403 -0
- goals/template_exchange.md +77 -0
- goals/thread_heatmap.md +77 -0
- goals/threat_modeler.md +77 -0
- goals/verification_iron_law.md +192 -0
- goals/vsm_dashboard.md +76 -0
- goals/writeguard.md +89 -0
- goals/zero_trust_architecture.md +403 -0
- hardprompts/__init__.py +6 -0
- hardprompts/agent/__init__.py +6 -0
- hardprompts/agent/agentic_architect.md +100 -0
- hardprompts/agent/debate_prompt.md +32 -0
- hardprompts/agent/fitness_evaluation.md +48 -0
- hardprompts/agent/governance_review.md +214 -0
- hardprompts/agent/reviewer_prompt.md +34 -0
- hardprompts/agent/skill_design.md +172 -0
- hardprompts/agent/task_decomposition.md +275 -0
- hardprompts/agent/veto_check_prompt.md +33 -0
- hardprompts/architect/__init__.py +6 -0
- hardprompts/architect/api_design.md +283 -0
- hardprompts/architect/data_model.md +277 -0
- hardprompts/architect/system_design.md +180 -0
- hardprompts/builder/__init__.py +6 -0
- hardprompts/builder/code_generation.md +59 -0
- hardprompts/builder/refactor.md +58 -0
- hardprompts/builder/scaffold_project.md +69 -0
- hardprompts/builder/test_generation.md +87 -0
- hardprompts/ci/__init__.py +6 -0
- hardprompts/ci/worktree_setup.md +35 -0
- hardprompts/compliance/__init__.py +6 -0
- hardprompts/compliance/cmmc_assessment.md +63 -0
- hardprompts/compliance/cssp_assessment.md +75 -0
- hardprompts/compliance/cui_marking.md +86 -0
- hardprompts/compliance/fedramp_assessment.md +55 -0
- hardprompts/compliance/ivv_assessment.md +96 -0
- hardprompts/compliance/poam_generation.md +57 -0
- hardprompts/compliance/sbd_assessment.md +101 -0
- hardprompts/compliance/security_categorization.md +74 -0
- hardprompts/compliance/ssp_generation.md +56 -0
- hardprompts/compliance/stig_evaluation.md +63 -0
- hardprompts/dashboard/__init__.py +6 -0
- hardprompts/dashboard/nlq_system_prompt.md +26 -0
- hardprompts/infra/__init__.py +6 -0
- hardprompts/infra/k8s_manifests.md +118 -0
- hardprompts/infra/pipeline_generation.md +160 -0
- hardprompts/infra/terraform_generation.md +92 -0
- hardprompts/integration/__init__.py +6 -0
- hardprompts/integration/approval_review.md +17 -0
- hardprompts/integration/jira_mapping.md +25 -0
- hardprompts/integration/servicenow_mapping.md +14 -0
- hardprompts/knowledge/__init__.py +6 -0
- hardprompts/knowledge/pattern_detection.md +73 -0
- hardprompts/knowledge/recommendation_engine.md +90 -0
- hardprompts/knowledge/root_cause_analysis.md +91 -0
- hardprompts/maintenance/__init__.py +6 -0
- hardprompts/maintenance/maintenance_assessment.md +82 -0
- hardprompts/mbse/__init__.py +6 -0
- hardprompts/mbse/digital_thread.md +67 -0
- hardprompts/mbse/model_import.md +62 -0
- hardprompts/mbse/model_to_code.md +65 -0
- hardprompts/modernization/__init__.py +6 -0
- hardprompts/modernization/legacy_analysis.md +93 -0
- hardprompts/modernization/migration_planning.md +150 -0
- hardprompts/modernization/seven_r_assessment.md +107 -0
- hardprompts/proposal_draft.md +53 -0
- hardprompts/rag_citation.md +12 -0
- hardprompts/rag_rerank.md +31 -0
- hardprompts/requirements/__init__.py +6 -0
- hardprompts/requirements/bdd_generation.md +35 -0
- hardprompts/requirements/clarification_prioritization.md +29 -0
- hardprompts/requirements/decomposition.md +60 -0
- hardprompts/requirements/document_extraction.md +45 -0
- hardprompts/requirements/gap_detection.md +70 -0
- hardprompts/requirements/intake_conversation.md +101 -0
- hardprompts/requirements/readiness_assessment.md +39 -0
- hardprompts/requirements/spec_quality.md +33 -0
- hardprompts/requirements/traceability_analysis.md +23 -0
- hardprompts/security/__init__.py +6 -0
- hardprompts/security/endpoint_security.md +78 -0
- hardprompts/security/threat_model.md +70 -0
- hardprompts/security/vulnerability_assessment.md +81 -0
- hardprompts/simulation/__init__.py +6 -0
- hardprompts/simulation/architecture_impact.md +27 -0
- hardprompts/simulation/coa_alternative.md +27 -0
- hardprompts/simulation/coa_generation.md +25 -0
- hardprompts/simulation/compliance_impact.md +28 -0
- hardprompts/simulation/cost_estimation.md +33 -0
- hardprompts/simulation/risk_assessment.md +28 -0
- hardprompts/translation/code_translation.md +68 -0
- hardprompts/translation/dependency_suggestion.md +44 -0
- hardprompts/translation/test_translation.md +64 -0
- hardprompts/translation/translation_repair.md +59 -0
- icdev-0.0.3.dist-info/METADATA +909 -0
- icdev-0.0.3.dist-info/RECORD +1214 -0
- icdev-0.0.3.dist-info/WHEEL +5 -0
- icdev-0.0.3.dist-info/entry_points.txt +9 -0
- icdev-0.0.3.dist-info/licenses/LICENSE +201 -0
- icdev-0.0.3.dist-info/licenses/NOTICE +11 -0
- icdev-0.0.3.dist-info/top_level.txt +7 -0
- memory/MEMORY.md +52 -0
- memory/logs/2026-02-14.md +17 -0
- memory/logs/2026-03-03.md +2 -0
- memory/logs/__init__.py +1 -0
- tools/a2a/icdev_callback_client.py +210 -0
- tools/agent/cards/architect_card.json +29 -0
- tools/agent/cards/builder_card.json +34 -0
- tools/agent/cards/compliance_card.json +29 -0
- tools/agent/cards/connector_forge_card.json +49 -0
- tools/agent/cards/devsecops_zta_card.json +24 -0
- tools/agent/cards/knowledge_card.json +29 -0
- tools/agent/cards/monitor_card.json +29 -0
- tools/agent/cards/orchestrator_card.json +29 -0
- tools/agent/cards/requirements_analyst_card.json +24 -0
- tools/agent/cards/security_card.json +29 -0
- tools/agent/cards/simulation_card.json +24 -0
- tools/agent/cards/supply_chain_card.json +24 -0
- tools/analysis/__init__.py +1 -0
- tools/analysis/code_analyzer.py +770 -0
- tools/analysis/runtime_feedback.py +379 -0
- tools/analytics/__init__.py +2 -0
- tools/analytics/scorecard.py +538 -0
- tools/analytics/vsm_engine.py +612 -0
- tools/architecture/__init__.py +2 -0
- tools/architecture/adr_extractor.py +393 -0
- tools/audit/__init__.py +1 -0
- tools/audit/audit_logger.py +199 -0
- tools/audit/audit_query.py +153 -0
- tools/audit/decision_recorder.py +73 -0
- tools/audit_engine/__init__.py +12 -0
- tools/audit_engine/ai_advisor.py +906 -0
- tools/audit_engine/cli.py +286 -0
- tools/audit_engine/comparator.py +305 -0
- tools/audit_engine/eject_scaffolder.py +399 -0
- tools/audit_engine/engine.py +614 -0
- tools/audit_engine/git_fetcher.py +341 -0
- tools/audit_engine/regime_loader.py +200 -0
- tools/audit_engine/regime_updater.py +325 -0
- tools/audit_engine/report_card.py +289 -0
- tools/audit_engine/scanner.py +684 -0
- tools/audit_engine/self_heal.py +1042 -0
- tools/ci/__init__.py +2 -0
- tools/ci/connectors/__init__.py +2 -0
- tools/ci/connectors/base_connector.py +80 -0
- tools/ci/connectors/connector_registry.py +188 -0
- tools/ci/connectors/mattermost_connector.py +159 -0
- tools/ci/connectors/slack_connector.py +197 -0
- tools/ci/core/__init__.py +2 -0
- tools/ci/core/air_gap_detector.py +115 -0
- tools/ci/core/comment_handler.py +192 -0
- tools/ci/core/conversation_manager.py +480 -0
- tools/ci/core/event_envelope.py +500 -0
- tools/ci/core/event_router.py +444 -0
- tools/ci/core/failure_parser.py +397 -0
- tools/ci/core/recovery_engine.py +527 -0
- tools/ci/gate_enforcer.py +361 -0
- tools/ci/modules/__init__.py +2 -0
- tools/ci/modules/agent.py +271 -0
- tools/ci/modules/git_ops.py +175 -0
- tools/ci/modules/state.py +117 -0
- tools/ci/modules/vcs.py +303 -0
- tools/ci/modules/workflow_ops.py +295 -0
- tools/ci/modules/worktree.py +337 -0
- tools/ci/pipeline_config_generator.py +558 -0
- tools/ci/pr_intelligence.py +485 -0
- tools/ci/triggers/__init__.py +2 -0
- tools/ci/triggers/gitlab_task_monitor.py +327 -0
- tools/ci/triggers/poll_trigger.py +237 -0
- tools/ci/triggers/webhook_server.py +356 -0
- tools/ci/workflows/__init__.py +2 -0
- tools/ci/workflows/icdev_build.py +140 -0
- tools/ci/workflows/icdev_comply.py +284 -0
- tools/ci/workflows/icdev_document.py +152 -0
- tools/ci/workflows/icdev_e2e.py +188 -0
- tools/ci/workflows/icdev_patch.py +186 -0
- tools/ci/workflows/icdev_plan.py +202 -0
- tools/ci/workflows/icdev_plan_build.py +41 -0
- tools/ci/workflows/icdev_plan_build_test.py +46 -0
- tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
- tools/ci/workflows/icdev_review.py +126 -0
- tools/ci/workflows/icdev_sdlc.py +261 -0
- tools/ci/workflows/icdev_test.py +240 -0
- tools/cli/__init__.py +1 -0
- tools/cli/output_formatter.py +756 -0
- tools/cloudforge/__init__.py +12 -0
- tools/cloudforge/airgap/__init__.py +2 -0
- tools/cloudforge/airgap/il_classifier.py +70 -0
- tools/cloudforge/airgap/offline_validator.py +42 -0
- tools/cloudforge/airgap/shift_emulator.py +155 -0
- tools/cloudforge/airgap/sneakernet.py +91 -0
- tools/cloudforge/cd_hub/__init__.py +2 -0
- tools/cloudforge/cd_hub/canary_deployer.py +88 -0
- tools/cloudforge/cd_hub/gitops_renderer.py +123 -0
- tools/cloudforge/cd_hub/hub_controller.py +143 -0
- tools/cloudforge/cd_hub/pipeline_bridge.py +30 -0
- tools/cloudforge/cd_hub/rollback_engine.py +29 -0
- tools/cloudforge/cd_hub/spoke_agent.py +51 -0
- tools/cloudforge/compliance/__init__.py +2 -0
- tools/cloudforge/compliance/ato_accelerator.py +272 -0
- tools/cloudforge/compliance/control_inheritor.py +127 -0
- tools/cloudforge/compliance/evidence_generator.py +129 -0
- tools/cloudforge/compliance/poam_bridge.py +41 -0
- tools/cloudforge/compliance/ssp_bridge.py +52 -0
- tools/cloudforge/compliance/stig_bridge.py +41 -0
- tools/cloudforge/container_forge/__init__.py +2 -0
- tools/cloudforge/container_forge/bigbang_renderer.py +85 -0
- tools/cloudforge/container_forge/hardener.py +169 -0
- tools/cloudforge/container_forge/image_scanner_bridge.py +33 -0
- tools/cloudforge/container_forge/runtime_policy.py +87 -0
- tools/cloudforge/container_forge/sbom_bridge.py +42 -0
- tools/cloudforge/finops/__init__.py +2 -0
- tools/cloudforge/finops/anomaly_detector.py +78 -0
- tools/cloudforge/finops/budget_tracker.py +96 -0
- tools/cloudforge/finops/chargeback.py +69 -0
- tools/cloudforge/finops/cost_collector.py +141 -0
- tools/cloudforge/finops/optimizer.py +55 -0
- tools/cloudforge/hybrid/__init__.py +2 -0
- tools/cloudforge/hybrid/connection_manager.py +141 -0
- tools/cloudforge/hybrid/dns_federator.py +56 -0
- tools/cloudforge/hybrid/health_monitor.py +108 -0
- tools/cloudforge/hybrid/identity_federator.py +53 -0
- tools/cloudforge/hybrid/network_bridge.py +68 -0
- tools/cloudforge/hybrid/topology_manager.py +147 -0
- tools/cloudforge/hybrid/workload_abstractor.py +92 -0
- tools/cloudforge/iac/__init__.py +2 -0
- tools/cloudforge/iac/drift_detector.py +154 -0
- tools/cloudforge/iac/module_library.py +265 -0
- tools/cloudforge/iac/opentofu_adapter.py +89 -0
- tools/cloudforge/iac/pulumi_renderer.py +292 -0
- tools/cloudforge/iac/state_backend.py +146 -0
- tools/cloudforge/iac/terraform_renderer.py +626 -0
- tools/cloudforge/landing_zone/__init__.py +2 -0
- tools/cloudforge/landing_zone/blueprint_loader.py +98 -0
- tools/cloudforge/landing_zone/blueprint_validator.py +113 -0
- tools/cloudforge/landing_zone/zone_provisioner.py +306 -0
- tools/cloudforge/landing_zone/zone_state.py +143 -0
- tools/cloudforge/mbse_thread/__init__.py +2 -0
- tools/cloudforge/mbse_thread/ato_thread_weaver.py +111 -0
- tools/cloudforge/mbse_thread/control_tracer.py +68 -0
- tools/cloudforge/mbse_thread/system_boundary.py +83 -0
- tools/cloudforge/metastore/__init__.py +2 -0
- tools/cloudforge/metastore/dependency_graph.py +202 -0
- tools/cloudforge/metastore/discovery.py +192 -0
- tools/cloudforge/metastore/registry.py +185 -0
- tools/cloudforge/metastore/rto_tracker.py +92 -0
- tools/cloudforge/metastore/runbook_linker.py +82 -0
- tools/cloudforge/migration/__init__.py +2 -0
- tools/cloudforge/migration/assessor.py +187 -0
- tools/cloudforge/migration/cutover_orchestrator.py +117 -0
- tools/cloudforge/migration/databridge_bridge.py +92 -0
- tools/cloudforge/migration/planner.py +98 -0
- tools/cloudforge/migration/risk_scorer.py +97 -0
- tools/cloudforge/migration/validation_runner.py +45 -0
- tools/cloudforge/migration/workload_inventory.py +107 -0
- tools/cloudforge/provider.py +319 -0
- tools/cloudforge/providers/__init__.py +2 -0
- tools/cloudforge/providers/aws_commercial.py +92 -0
- tools/cloudforge/providers/aws_govcloud.py +229 -0
- tools/cloudforge/providers/aws_secret.py +83 -0
- tools/cloudforge/providers/azure_commercial.py +80 -0
- tools/cloudforge/providers/azure_gov.py +91 -0
- tools/cloudforge/providers/azure_secret.py +71 -0
- tools/cloudforge/providers/gcp.py +102 -0
- tools/cloudforge/providers/oci.py +102 -0
- tools/cloudforge/registry.py +140 -0
- tools/cloudforge/runbooks/__init__.py +2 -0
- tools/cloudforge/runbooks/ai_generator.py +119 -0
- tools/cloudforge/runbooks/dag_validator.py +219 -0
- tools/cloudforge/runbooks/engine.py +470 -0
- tools/cloudforge/runbooks/models.py +99 -0
- tools/cloudforge/runbooks/snippet_library.py +158 -0
- tools/cloudforge/runbooks/template_loader.py +122 -0
- tools/cloudforge/runbooks/visualization.py +108 -0
- tools/cloudforge/siem/__init__.py +2 -0
- tools/cloudforge/siem/alert_rules.py +86 -0
- tools/cloudforge/siem/correlation_engine.py +61 -0
- tools/cloudforge/siem/log_aggregator.py +113 -0
- tools/cloudforge/siem/siem_dashboard_data.py +28 -0
- tools/cloudforge/supply_chain/__init__.py +2 -0
- tools/cloudforge/supply_chain/bridge.py +33 -0
- tools/cloudforge/supply_chain/iac_dependency_scanner.py +36 -0
- tools/cloudforge/supply_chain/provider_trust_scorer.py +54 -0
- tools/compat/__init__.py +21 -0
- tools/compat/cli_harmonizer.py +251 -0
- tools/compat/datetime_utils.py +18 -0
- tools/compat/db_utils.py +190 -0
- tools/compat/platform_utils.py +123 -0
- tools/compliance/__init__.py +1 -0
- tools/compliance/accountability_manager.py +391 -0
- tools/compliance/ai_accountability_audit.py +287 -0
- tools/compliance/ai_impact_assessor.py +267 -0
- tools/compliance/ai_incident_response.py +295 -0
- tools/compliance/ai_inventory_manager.py +233 -0
- tools/compliance/ai_reassessment_scheduler.py +250 -0
- tools/compliance/ai_transparency_audit.py +247 -0
- tools/compliance/atlas_assessor.py +276 -0
- tools/compliance/atlas_report_generator.py +1199 -0
- tools/compliance/base_assessor.py +591 -0
- tools/compliance/cato_live_engine.py +607 -0
- tools/compliance/cato_monitor.py +1371 -0
- tools/compliance/cato_scheduler.py +698 -0
- tools/compliance/cjis_assessor.py +76 -0
- tools/compliance/classification_manager.py +1340 -0
- tools/compliance/cmmc_assessor.py +1478 -0
- tools/compliance/cmmc_report_generator.py +1087 -0
- tools/compliance/compliance_detector.py +452 -0
- tools/compliance/compliance_exporter.py +418 -0
- tools/compliance/compliance_status.py +810 -0
- tools/compliance/control_mapper.py +488 -0
- tools/compliance/crosswalk_engine.py +1208 -0
- tools/compliance/cssp_assessor.py +1032 -0
- tools/compliance/cssp_evidence_collector.py +716 -0
- tools/compliance/cssp_report_generator.py +1103 -0
- tools/compliance/cui_marker.py +387 -0
- tools/compliance/diagram_validator.py +599 -0
- tools/compliance/emass/__init__.py +2 -0
- tools/compliance/emass/emass_client.py +822 -0
- tools/compliance/emass/emass_export.py +758 -0
- tools/compliance/emass/emass_sync.py +807 -0
- tools/compliance/eu_ai_act_classifier.py +193 -0
- tools/compliance/evidence_collector.py +459 -0
- tools/compliance/fairness_assessor.py +310 -0
- tools/compliance/fedramp_20x_ksi_emitter.py +692 -0
- tools/compliance/fedramp_assessor.py +1795 -0
- tools/compliance/fedramp_authorization_packager.py +137 -0
- tools/compliance/fedramp_ksi_generator.py +349 -0
- tools/compliance/fedramp_report_generator.py +1115 -0
- tools/compliance/fips199_categorizer.py +869 -0
- tools/compliance/fips200_validator.py +304 -0
- tools/compliance/firmware_sbom.py +646 -0
- tools/compliance/gao_ai_assessor.py +228 -0
- tools/compliance/gao_evidence_builder.py +302 -0
- tools/compliance/hipaa_assessor.py +78 -0
- tools/compliance/hitrust_assessor.py +49 -0
- tools/compliance/incident_response_plan.py +705 -0
- tools/compliance/inheritance_engine.py +693 -0
- tools/compliance/iso27001_assessor.py +92 -0
- tools/compliance/iso42001_assessor.py +114 -0
- tools/compliance/ivv_assessor.py +2314 -0
- tools/compliance/ivv_report_generator.py +1649 -0
- tools/compliance/model_card_generator.py +291 -0
- tools/compliance/mosa_assessor.py +117 -0
- tools/compliance/multi_regime_assessor.py +441 -0
- tools/compliance/narrative_generator.py +1012 -0
- tools/compliance/narrative_quality_gate.py +701 -0
- tools/compliance/narrative_workflow.py +814 -0
- tools/compliance/nist_800_207_assessor.py +191 -0
- tools/compliance/nist_ai_600_1_assessor.py +185 -0
- tools/compliance/nist_ai_rmf_assessor.py +110 -0
- tools/compliance/nist_lookup.py +244 -0
- tools/compliance/omb_m25_21_assessor.py +225 -0
- tools/compliance/omb_m26_04_assessor.py +185 -0
- tools/compliance/oscal_catalog_adapter.py +395 -0
- tools/compliance/oscal_generator.py +2157 -0
- tools/compliance/oscal_tools.py +1182 -0
- tools/compliance/oscal_validator.py +692 -0
- tools/compliance/owasp_agentic_assessor.py +227 -0
- tools/compliance/owasp_asi_assessor.py +197 -0
- tools/compliance/owasp_llm_assessor.py +245 -0
- tools/compliance/pci_dss_assessor.py +80 -0
- tools/compliance/pi_compliance_tracker.py +1447 -0
- tools/compliance/poam_generator.py +388 -0
- tools/compliance/resolve_marking.py +272 -0
- tools/compliance/sbd_assessor.py +2070 -0
- tools/compliance/sbd_report_generator.py +1223 -0
- tools/compliance/sbom_generator.py +993 -0
- tools/compliance/siem_config_generator.py +661 -0
- tools/compliance/slsa_attestation_generator.py +479 -0
- tools/compliance/soc2_assessor.py +77 -0
- tools/compliance/ssp_generator.py +556 -0
- tools/compliance/stig_checker.py +712 -0
- tools/compliance/swft_evidence_bundler.py +326 -0
- tools/compliance/system_card_generator.py +303 -0
- tools/compliance/template_exchange.py +513 -0
- tools/compliance/traceability_matrix.py +1268 -0
- tools/compliance/universal_classification_manager.py +1159 -0
- tools/compliance/xacta/__init__.py +2 -0
- tools/compliance/xacta/xacta_client.py +438 -0
- tools/compliance/xacta/xacta_export.py +546 -0
- tools/compliance/xacta/xacta_sync.py +322 -0
- tools/compliance/xai_assessor.py +231 -0
- tools/core/__init__.py +2 -0
- tools/core/circuit_breaker.py +353 -0
- tools/core/compliance_sidecar.py +344 -0
- tools/core/container.py +110 -0
- tools/core/errors.py +256 -0
- tools/core/feature_flags.py +311 -0
- tools/core/task_dlq.py +350 -0
- tools/dashboard/__init__.py +2 -0
- tools/dashboard/app.py +6288 -0
- tools/dashboard/templates/agent_evolution.html +287 -0
- tools/dashboard/templates/agents/list.html +71 -0
- tools/dashboard/templates/agents.html +132 -0
- tools/dashboard/templates/architecture.html +289 -0
- tools/dashboard/templates/ato_simulator.html +170 -0
- tools/dashboard/templates/audit_engine.html +844 -0
- tools/dashboard/templates/base.html +236 -0
- tools/dashboard/templates/cato_live.html +116 -0
- tools/dashboard/templates/cloudforge.html +195 -0
- tools/dashboard/templates/cloudforge_finops.html +111 -0
- tools/dashboard/templates/cloudforge_hybrid.html +122 -0
- tools/dashboard/templates/cloudforge_metastore.html +234 -0
- tools/dashboard/templates/cloudforge_migration.html +87 -0
- tools/dashboard/templates/cloudforge_runbooks.html +201 -0
- tools/dashboard/templates/cloudforge_siem.html +94 -0
- tools/dashboard/templates/compliance_accel.html +292 -0
- tools/dashboard/templates/crashes.html +122 -0
- tools/dashboard/templates/databridge.html +305 -0
- tools/dashboard/templates/databridge_analytics.html +195 -0
- tools/dashboard/templates/databridge_mapping.html +345 -0
- tools/dashboard/templates/databridge_messaging.html +321 -0
- tools/dashboard/templates/decisions.html +258 -0
- tools/dashboard/templates/devices.html +151 -0
- tools/dashboard/templates/devsecops_maturity.html +278 -0
- tools/dashboard/templates/edge_ai.html +128 -0
- tools/dashboard/templates/firmware.html +120 -0
- tools/dashboard/templates/firmware_sbom.html +193 -0
- tools/dashboard/templates/forge_hub.html +196 -0
- tools/dashboard/templates/forge_studio.html +379 -0
- tools/dashboard/templates/forge_studio_analytics.html +360 -0
- tools/dashboard/templates/forge_studio_builder.html +1637 -0
- tools/dashboard/templates/forge_studio_compliance.html +310 -0
- tools/dashboard/templates/forge_studio_deploy.html +573 -0
- tools/dashboard/templates/forge_studio_enterprise.html +888 -0
- tools/dashboard/templates/forge_studio_marketplace.html +502 -0
- tools/dashboard/templates/forge_studio_workflow.html +696 -0
- tools/dashboard/templates/golden_path.html +175 -0
- tools/dashboard/templates/govcon.html +280 -0
- tools/dashboard/templates/harness.html +148 -0
- tools/dashboard/templates/index.html +207 -0
- tools/dashboard/templates/intelligence.html +336 -0
- tools/dashboard/templates/knowledge/index.html +190 -0
- tools/dashboard/templates/knowledge_graph.html +739 -0
- tools/dashboard/templates/login.html +51 -0
- tools/dashboard/templates/marketplace.html +336 -0
- tools/dashboard/templates/marketplace_admin.html +247 -0
- tools/dashboard/templates/missions.html +403 -0
- tools/dashboard/templates/narratives.html +154 -0
- tools/dashboard/templates/pr_intelligence.html +151 -0
- tools/dashboard/templates/proposals/detail.html +300 -0
- tools/dashboard/templates/proposals/list.html +52 -0
- tools/dashboard/templates/proposals/sam_detail.html +132 -0
- tools/dashboard/templates/proposals/section_detail.html +375 -0
- tools/dashboard/templates/research.html +222 -0
- tools/dashboard/templates/resilience.html +300 -0
- tools/dashboard/templates/scorecard.html +162 -0
- tools/dashboard/templates/simulator.html +131 -0
- tools/dashboard/templates/template_exchange.html +147 -0
- tools/dashboard/templates/thread_heatmap.html +151 -0
- tools/dashboard/templates/threat_model.html +195 -0
- tools/dashboard/templates/vsm.html +141 -0
- tools/dashboard/templates/writeguard.html +277 -0
- tools/databridge/__init__.py +5 -0
- tools/databridge/agent/__init__.py +2 -0
- tools/databridge/agent/daemon.py +227 -0
- tools/databridge/agent/tunnel.py +101 -0
- tools/databridge/agent/ws_relay.py +91 -0
- tools/databridge/analytics.py +167 -0
- tools/databridge/arrow_pipeline.py +327 -0
- tools/databridge/connection_manager.py +424 -0
- tools/databridge/connector.py +331 -0
- tools/databridge/connectors/__init__.py +2 -0
- tools/databridge/connectors/argocd_connector.py +160 -0
- tools/databridge/connectors/avro_connector.py +203 -0
- tools/databridge/connectors/azure_blob.py +63 -0
- tools/databridge/connectors/cdc_connector.py +205 -0
- tools/databridge/connectors/csv_connector.py +172 -0
- tools/databridge/connectors/datadog_connector.py +153 -0
- tools/databridge/connectors/discord_messaging.py +215 -0
- tools/databridge/connectors/dynamics365.py +151 -0
- tools/databridge/connectors/elasticsearch_connector.py +145 -0
- tools/databridge/connectors/email_base.py +114 -0
- tools/databridge/connectors/excel_connector.py +175 -0
- tools/databridge/connectors/fsspec_base.py +300 -0
- tools/databridge/connectors/gcs.py +53 -0
- tools/databridge/connectors/github_connector.py +138 -0
- tools/databridge/connectors/gitlab_connector.py +132 -0
- tools/databridge/connectors/gmail_connector.py +182 -0
- tools/databridge/connectors/hdfs.py +57 -0
- tools/databridge/connectors/health_base.py +401 -0
- tools/databridge/connectors/hubspot.py +124 -0
- tools/databridge/connectors/imap_connector.py +171 -0
- tools/databridge/connectors/jenkins_connector.py +138 -0
- tools/databridge/connectors/jira_connector.py +86 -0
- tools/databridge/connectors/json_connector.py +184 -0
- tools/databridge/connectors/kafka_connector.py +246 -0
- tools/databridge/connectors/kinesis_connector.py +238 -0
- tools/databridge/connectors/local_fs.py +30 -0
- tools/databridge/connectors/matrix.py +197 -0
- tools/databridge/connectors/mattermost_messaging.py +184 -0
- tools/databridge/connectors/messaging_base.py +172 -0
- tools/databridge/connectors/mssql.py +63 -0
- tools/databridge/connectors/mysql.py +57 -0
- tools/databridge/connectors/netsuite.py +170 -0
- tools/databridge/connectors/o365_mail.py +196 -0
- tools/databridge/connectors/oracle.py +65 -0
- tools/databridge/connectors/pagerduty_connector.py +162 -0
- tools/databridge/connectors/parquet_connector.py +131 -0
- tools/databridge/connectors/postgresql.py +58 -0
- tools/databridge/connectors/s3.py +65 -0
- tools/databridge/connectors/saas_base.py +198 -0
- tools/databridge/connectors/salesforce.py +126 -0
- tools/databridge/connectors/sap.py +89 -0
- tools/databridge/connectors/servicenow.py +60 -0
- tools/databridge/connectors/signal_messaging.py +150 -0
- tools/databridge/connectors/slack_messaging.py +203 -0
- tools/databridge/connectors/smtp_connector.py +126 -0
- tools/databridge/connectors/soap_base.py +258 -0
- tools/databridge/connectors/splunk_connector.py +171 -0
- tools/databridge/connectors/sql_base.py +310 -0
- tools/databridge/connectors/sqlite_connector.py +76 -0
- tools/databridge/connectors/teams.py +148 -0
- tools/databridge/connectors/telegram.py +192 -0
- tools/databridge/connectors/whatsapp.py +137 -0
- tools/databridge/data_profiler.py +99 -0
- tools/databridge/forge/__init__.py +6 -0
- tools/databridge/forge/base_selector.py +150 -0
- tools/databridge/forge/code_generator.py +206 -0
- tools/databridge/forge/community_hub.py +539 -0
- tools/databridge/forge/forge_agent.py +306 -0
- tools/databridge/forge/import_handler.py +133 -0
- tools/databridge/forge/integration_tester.py +127 -0
- tools/databridge/forge/marketplace_publisher.py +164 -0
- tools/databridge/forge/promoter.py +159 -0
- tools/databridge/forge/sandbox_manager.py +257 -0
- tools/databridge/forge/spec_parser.py +358 -0
- tools/databridge/forge/static_validator.py +363 -0
- tools/databridge/forge/templates/__init__.py +591 -0
- tools/databridge/format_converter.py +188 -0
- tools/databridge/mapping_engine.py +348 -0
- tools/databridge/messaging/__init__.py +5 -0
- tools/databridge/messaging/agent_bridge.py +254 -0
- tools/databridge/messaging/message_envelope.py +111 -0
- tools/databridge/messaging/message_logger.py +204 -0
- tools/databridge/messaging/messaging_daemon.py +326 -0
- tools/databridge/messaging/oauth2_manager.py +411 -0
- tools/databridge/pii_detector.py +221 -0
- tools/databridge/registry.py +352 -0
- tools/databridge/relay_server.py +105 -0
- tools/databridge/scale/__init__.py +16 -0
- tools/databridge/scale/backpressure.py +134 -0
- tools/databridge/scale/chunked_pipeline.py +169 -0
- tools/databridge/scale/connection_pool.py +293 -0
- tools/databridge/scale/engine.py +492 -0
- tools/databridge/scale/worker_pool.py +140 -0
- tools/databridge/scale/write_batcher.py +250 -0
- tools/databridge/schema_engine.py +324 -0
- tools/databridge/stream_manager.py +225 -0
- tools/databridge/sync_engine.py +411 -0
- tools/databridge/transforms.py +302 -0
- tools/db/__init__.py +1 -0
- tools/db/backup.py +312 -0
- tools/db/backup_manager.py +832 -0
- tools/db/init_icdev_db.py +7753 -0
- tools/db/init_sparkpilot_db.py +431 -0
- tools/db/migrate.py +177 -0
- tools/db/migrate_innovation_audit.py +165 -0
- tools/db/migration_runner.py +548 -0
- tools/db/migrations/001_baseline/meta.json +9 -0
- tools/db/migrations/001_baseline/up.py +67 -0
- tools/db/migrations/002_memory_enhancements/down.sql +8 -0
- tools/db/migrations/002_memory_enhancements/meta.json +9 -0
- tools/db/migrations/002_memory_enhancements/up.py +119 -0
- tools/db/migrations/003_dev_profiles/meta.json +8 -0
- tools/db/migrations/003_dev_profiles/up.py +93 -0
- tools/db/migrations/004_innovation_engine/down.py +19 -0
- tools/db/migrations/004_innovation_engine/up.py +227 -0
- tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
- tools/db/migrations/005_phase_37_ai_security/up.py +257 -0
- tools/db/migrations/006_phase_36_evolution/down.py +21 -0
- tools/db/migrations/006_phase_36_evolution/up.py +323 -0
- tools/db/migrations/007_phase_38_cloud/down.py +14 -0
- tools/db/migrations/007_phase_38_cloud/up.py +110 -0
- tools/db/migrations/008_phase36_37_integration/up.py +55 -0
- tools/db/migrations/__init__.py +2 -0
- tools/db/pg_migrate.py +642 -0
- tools/db/storage.py +1080 -0
- tools/decisions/__init__.py +2 -0
- tools/decisions/dmn_engine.py +695 -0
- tools/devsecops/__init__.py +2 -0
- tools/devsecops/attestation_manager.py +449 -0
- tools/devsecops/network_segmentation_generator.py +604 -0
- tools/devsecops/pdp_config_generator.py +1246 -0
- tools/devsecops/pipeline_security_generator.py +475 -0
- tools/devsecops/policy_generator.py +644 -0
- tools/devsecops/profile_manager.py +374 -0
- tools/devsecops/service_mesh_generator.py +1063 -0
- tools/devsecops/zta_maturity_scorer.py +355 -0
- tools/devsecops/zta_terraform_generator.py +1301 -0
- tools/edge_ai/__init__.py +2 -0
- tools/edge_ai/model_manager.py +200 -0
- tools/embedded/__init__.py +2 -0
- tools/embedded/cmake_generator.py +318 -0
- tools/embedded/crash_analyzer.py +191 -0
- tools/embedded/nl_to_firmware.py +277 -0
- tools/events/__init__.py +1 -0
- tools/events/event_bus.py +199 -0
- tools/finetune/pair_generator.py +832 -0
- tools/fleet/__init__.py +2 -0
- tools/fleet/device_registry.py +148 -0
- tools/fleet/ota_manager.py +153 -0
- tools/forge_studio/__init__.py +13 -0
- tools/forge_studio/analytics/__init__.py +0 -0
- tools/forge_studio/analytics/process_miner.py +383 -0
- tools/forge_studio/audit.py +183 -0
- tools/forge_studio/blueprint/__init__.py +2 -0
- tools/forge_studio/blueprint/build_tracker.py +317 -0
- tools/forge_studio/blueprint/export_engine.py +441 -0
- tools/forge_studio/blueprint/parent_client.py +335 -0
- tools/forge_studio/catalog/__init__.py +2 -0
- tools/forge_studio/catalog/component_registry.py +176 -0
- tools/forge_studio/catalog/schema_validator.py +193 -0
- tools/forge_studio/compliance/__init__.py +1 -0
- tools/forge_studio/compliance/compliance_wiring.py +554 -0
- tools/forge_studio/deploy/__init__.py +1 -0
- tools/forge_studio/deploy/airgap_packager.py +466 -0
- tools/forge_studio/deploy/deploy_engine.py +1792 -0
- tools/forge_studio/deploy/env_manager.py +431 -0
- tools/forge_studio/eject/__init__.py +2 -0
- tools/forge_studio/eject/docker_compose_generator.py +237 -0
- tools/forge_studio/eject/eject_engine.py +230 -0
- tools/forge_studio/eject/expo_scaffolder.py +303 -0
- tools/forge_studio/eject/nextjs_scaffolder.py +338 -0
- tools/forge_studio/enterprise/__init__.py +0 -0
- tools/forge_studio/enterprise/custom_frameworks.py +826 -0
- tools/forge_studio/enterprise/hardening_engine.py +1530 -0
- tools/forge_studio/enterprise/sso_manager.py +718 -0
- tools/forge_studio/enterprise/whitelabel_engine.py +887 -0
- tools/forge_studio/formula/__init__.py +0 -0
- tools/forge_studio/formula/expression_engine.py +562 -0
- tools/forge_studio/formula/formula_registry.py +265 -0
- tools/forge_studio/generator/__init__.py +2 -0
- tools/forge_studio/generator/app_generator.py +584 -0
- tools/forge_studio/generator/complexity_detector.py +368 -0
- tools/forge_studio/generator/prompt_templates.py +104 -0
- tools/forge_studio/generator/spec_builder.py +192 -0
- tools/forge_studio/intake_bridge.py +898 -0
- tools/forge_studio/marketplace/__init__.py +0 -0
- tools/forge_studio/marketplace/component_hub.py +428 -0
- tools/forge_studio/models.py +369 -0
- tools/forge_studio/renderer/__init__.py +2 -0
- tools/forge_studio/renderer/json_render_engine.py +623 -0
- tools/forge_studio/renderer/layout_engine.py +214 -0
- tools/forge_studio/renderer/rn_component_map.py +182 -0
- tools/forge_studio/supabase/__init__.py +2 -0
- tools/forge_studio/supabase/auth_generator.py +283 -0
- tools/forge_studio/supabase/migration_generator.py +93 -0
- tools/forge_studio/supabase/schema_generator.py +281 -0
- tools/forge_studio/tenant_manager.py +387 -0
- tools/forge_studio/workflow/__init__.py +2 -0
- tools/forge_studio/workflow/bpmn_adapter.py +489 -0
- tools/govcon/draft_orchestrator.py +1151 -0
- tools/govcon/engine_enrichment.py +373 -0
- tools/govcon/knowledge_base.py +487 -0
- tools/govcon/knowledge_ingestion.py +510 -0
- tools/govcon/sam_scanner.py +754 -0
- tools/harness/__init__.py +6 -0
- tools/harness/exit_criteria_evaluator.py +231 -0
- tools/harness/maturity_assessor.py +347 -0
- tools/harness/scaffold_harness.py +416 -0
- tools/harness/trace_analyzer.py +281 -0
- tools/infra/__init__.py +1 -0
- tools/infra/ansible_generator.py +867 -0
- tools/infra/dockerfile_generator.py +359 -0
- tools/infra/infra_status.py +384 -0
- tools/infra/ironbank_metadata_generator.py +403 -0
- tools/infra/k8s_generator.py +1000 -0
- tools/infra/pipeline_generator.py +830 -0
- tools/infra/rollback.py +389 -0
- tools/infra/terraform_generator.py +1140 -0
- tools/infra/terraform_generator_azure.py +1252 -0
- tools/infra/terraform_generator_gcp.py +951 -0
- tools/infra/terraform_generator_ibm.py +359 -0
- tools/infra/terraform_generator_oci.py +918 -0
- tools/infra/terraform_generator_onprem.py +318 -0
- tools/knowledge/__init__.py +1 -0
- tools/knowledge/knowledge_ingest.py +281 -0
- tools/knowledge/pattern_detector.py +681 -0
- tools/knowledge/recommendation_engine.py +449 -0
- tools/knowledge/self_heal_analyzer.py +492 -0
- tools/knowledge_graph/__init__.py +2 -0
- tools/knowledge_graph/graph_rag.py +498 -0
- tools/knowledge_graph/ingester.py +406 -0
- tools/knowledge_graph/insight_generator.py +369 -0
- tools/knowledge_graph/text_network.py +832 -0
- tools/llm/__init__.py +72 -0
- tools/llm/anthropic_provider.py +170 -0
- tools/llm/azure_openai_provider.py +338 -0
- tools/llm/bedrock_provider.py +315 -0
- tools/llm/embedding_provider.py +438 -0
- tools/llm/gemini_provider.py +381 -0
- tools/llm/ibm_watsonx_provider.py +231 -0
- tools/llm/oci_genai_provider.py +462 -0
- tools/llm/ollama_provider.py +350 -0
- tools/llm/openai_provider.py +225 -0
- tools/llm/prompt_registry.py +447 -0
- tools/llm/provider.py +355 -0
- tools/llm/provider_sdk.py +175 -0
- tools/llm/router.py +1124 -0
- tools/llm/semantic_cache.py +394 -0
- tools/llm/vertex_ai_provider.py +374 -0
- tools/maintenance/__init__.py +2 -0
- tools/maintenance/dependency_scanner.py +1016 -0
- tools/maintenance/maintenance_auditor.py +804 -0
- tools/maintenance/remediation_engine.py +957 -0
- tools/maintenance/vulnerability_checker.py +978 -0
- tools/manifest.md +1066 -0
- tools/marketplace/asset_installer.py +639 -0
- tools/marketplace/feedback_validator.py +359 -0
- tools/marketplace/license_client.py +458 -0
- tools/marketplace/module_crypto.py +544 -0
- tools/marketplace/module_runtime.py +236 -0
- tools/marketplace/token_store.py +264 -0
- tools/mbse/__init__.py +3 -0
- tools/mbse/des_assessor.py +1173 -0
- tools/mbse/des_report_generator.py +787 -0
- tools/mbse/diagram_extractor.py +792 -0
- tools/mbse/digital_thread.py +1650 -0
- tools/mbse/model_code_generator.py +1115 -0
- tools/mbse/model_control_mapper.py +410 -0
- tools/mbse/pi_model_tracker.py +1079 -0
- tools/mbse/reqif_parser.py +1468 -0
- tools/mbse/sync_engine.py +1789 -0
- tools/mbse/thread_heatmap.py +445 -0
- tools/mbse/xmi_parser.py +1558 -0
- tools/mcp/builder_server.py +64 -0
- tools/mcp/compliance_server.py +64 -0
- tools/mcp/connector_forge_server.py +155 -0
- tools/mcp/core_server.py +64 -0
- tools/mcp/devsecops_server.py +11 -0
- tools/mcp/devsecops_zta_server.py +64 -0
- tools/mcp/knowledge_server.py +64 -0
- tools/mcp/monitor_server.py +64 -0
- tools/mcp/ops_server.py +300 -0
- tools/mcp/requirements_analyst_server.py +64 -0
- tools/mcp/requirements_server.py +11 -0
- tools/mcp/security_server.py +64 -0
- tools/mcp/simulation_server.py +64 -0
- tools/mcp/supply_chain_server.py +64 -0
- tools/mcp/tool_registry.py +299 -0
- tools/memory/__init__.py +2 -0
- tools/memory/auto_capture.py +346 -0
- tools/memory/embed_memory.py +157 -0
- tools/memory/history_compressor.py +334 -0
- tools/memory/hybrid_search.py +235 -0
- tools/memory/maintenance_cron.py +288 -0
- tools/memory/memory_consolidation.py +439 -0
- tools/memory/memory_db.py +132 -0
- tools/memory/memory_read.py +101 -0
- tools/memory/memory_write.py +221 -0
- tools/memory/semantic_search.py +138 -0
- tools/memory/time_decay.py +434 -0
- tools/missions/__init__.py +2 -0
- tools/missions/mission_engine.py +459 -0
- tools/monitor/__init__.py +1 -0
- tools/monitor/alert_correlator.py +486 -0
- tools/monitor/auto_resolver.py +603 -0
- tools/monitor/health_checker.py +507 -0
- tools/monitor/heartbeat_daemon.py +779 -0
- tools/monitor/log_analyzer.py +507 -0
- tools/monitor/metric_collector.py +484 -0
- tools/mosa/__init__.py +10 -0
- tools/mosa/icd_generator.py +358 -0
- tools/mosa/modular_design_analyzer.py +682 -0
- tools/mosa/mosa_code_enforcer.py +348 -0
- tools/mosa/tsp_generator.py +265 -0
- tools/observability/__init__.py +100 -0
- tools/observability/genai_attributes.py +88 -0
- tools/observability/instrumentation.py +140 -0
- tools/observability/mlflow_exporter.py +193 -0
- tools/observability/otel_tracer.py +168 -0
- tools/observability/provenance/__init__.py +3 -0
- tools/observability/provenance/prov_recorder.py +322 -0
- tools/observability/shap/__init__.py +3 -0
- tools/observability/shap/agent_shap.py +274 -0
- tools/observability/sqlite_tracer.py +360 -0
- tools/observability/trace_context.py +205 -0
- tools/observability/tracer.py +230 -0
- tools/orchestration/__init__.py +1 -0
- tools/orchestration/peer_channels.py +254 -0
- tools/orchestration/saga_coordinator.py +390 -0
- tools/project/__init__.py +1 -0
- tools/project/manifest_loader.py +418 -0
- tools/project/project_create.py +350 -0
- tools/project/project_list.py +171 -0
- tools/project/project_scaffold.py +1715 -0
- tools/project/project_status.py +478 -0
- tools/project/session_context_builder.py +752 -0
- tools/project/validate_manifest.py +54 -0
- tools/rag/corrective_rag.py +582 -0
- tools/rag/source_registry.py +482 -0
- tools/requirements/__init__.py +1 -0
- tools/requirements/ai_governance_scorer.py +207 -0
- tools/requirements/boundary_analyzer.py +1281 -0
- tools/requirements/clarification_engine.py +605 -0
- tools/requirements/complexity_scorer.py +369 -0
- tools/requirements/consistency_analyzer.py +789 -0
- tools/requirements/constitution_manager.py +592 -0
- tools/requirements/decomposition_engine.py +764 -0
- tools/requirements/document_extractor.py +1002 -0
- tools/requirements/elicitation_techniques.py +508 -0
- tools/requirements/gap_detector.py +260 -0
- tools/requirements/intake_engine.py +2175 -0
- tools/requirements/prd_generator.py +839 -0
- tools/requirements/prd_validator.py +584 -0
- tools/requirements/readiness_scorer.py +302 -0
- tools/requirements/spec_organizer.py +1015 -0
- tools/requirements/spec_quality_checker.py +1083 -0
- tools/requirements/traceability_builder.py +566 -0
- tools/research/__init__.py +3 -0
- tools/research/academic_scanner.py +130 -0
- tools/research/build_buy_analyzer.py +229 -0
- tools/research/challenge_scorer.py +280 -0
- tools/research/community_scanner.py +174 -0
- tools/research/cross_engine_bridge.py +124 -0
- tools/research/dossier_generator.py +305 -0
- tools/research/landscape_scanner.py +315 -0
- tools/research/regulatory_scanner.py +248 -0
- tools/research/research_manager.py +469 -0
- tools/research/source_scanner.py +150 -0
- tools/research/vertical_loader.py +118 -0
- tools/saas/__init__.py +0 -0
- tools/saas/licensing/__init__.py +0 -0
- tools/saas/licensing/license_validator.py +345 -0
- tools/scaffold/__init__.py +2 -0
- tools/scaffold/golden_path.py +504 -0
- tools/security/__init__.py +1 -0
- tools/security/agent_output_validator.py +330 -0
- tools/security/agent_trust_scorer.py +652 -0
- tools/security/ai_bom_generator.py +718 -0
- tools/security/ai_telemetry_logger.py +469 -0
- tools/security/atlas_red_team.py +541 -0
- tools/security/code_pattern_scanner.py +382 -0
- tools/security/confabulation_detector.py +265 -0
- tools/security/container_scanner.py +489 -0
- tools/security/dependency_auditor.py +942 -0
- tools/security/endpoint_security_scanner.py +626 -0
- tools/security/mcp_tool_authorizer.py +242 -0
- tools/security/output_verifier.py +427 -0
- tools/security/prompt_injection_detector.py +737 -0
- tools/security/sast_runner.py +946 -0
- tools/security/secret_detector.py +376 -0
- tools/security/threat_modeler.py +678 -0
- tools/security/tool_chain_validator.py +357 -0
- tools/security/vuln_scanner.py +536 -0
- tools/simulation/__init__.py +2 -0
- tools/simulation/ato_simulator.py +517 -0
- tools/simulation/coa_generator.py +1539 -0
- tools/simulation/monte_carlo.py +745 -0
- tools/simulation/scenario_manager.py +1060 -0
- tools/simulation/simulation_engine.py +1091 -0
- tools/simulator/__init__.py +2 -0
- tools/simulator/sim_runner.py +272 -0
- tools/supply_chain/__init__.py +2 -0
- tools/supply_chain/cve_triager.py +690 -0
- tools/supply_chain/dependency_graph.py +630 -0
- tools/supply_chain/isa_manager.py +526 -0
- tools/supply_chain/scrm_assessor.py +531 -0
- tools/supply_chain/slsa_verifier.py +473 -0
- tools/testing/__init__.py +2 -0
- tools/testing/acceptance_validator.py +411 -0
- tools/testing/api_surface_extractor.py +749 -0
- tools/testing/claude_dir_validator.py +831 -0
- tools/testing/data_types.py +199 -0
- tools/testing/e2e_runner.py +715 -0
- tools/testing/fuzz_cli.py +306 -0
- tools/testing/health_check.py +483 -0
- tools/testing/platform_check.py +143 -0
- tools/testing/production_audit.py +1836 -0
- tools/testing/production_remediate.py +803 -0
- tools/testing/screenshot_validator.py +538 -0
- tools/testing/smoke_test.py +283 -0
- tools/testing/test_agent_models.py +117 -0
- tools/testing/test_orchestrator.py +957 -0
- tools/testing/utils.py +229 -0
- tools/writeguard/__init__.py +1 -0
- tools/writeguard/main.py +1 -0
- tools/writing/__init__.py +7 -0
- tools/writing/ai_content_detector.py +316 -0
- tools/writing/analysis_engine.py +454 -0
- tools/writing/batch_analyzer.py +276 -0
- tools/writing/coherence_analyzer.py +221 -0
- tools/writing/govcon_bridge.py +509 -0
- tools/writing/grammar_checker.py +270 -0
- tools/writing/plagiarism_detector.py +106 -0
- tools/writing/readability_scorer.py +201 -0
- tools/writing/rewriter.py +96 -0
- tools/writing/signal_registrar.py +167 -0
- tools/writing/snippet_manager.py +276 -0
- tools/writing/style_enforcer.py +220 -0
- tools/writing/style_guide_manager.py +438 -0
- tools/writing/tone_profiler.py +168 -0
|
@@ -0,0 +1,906 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# CUI // SP-CTI
|
|
3
|
+
# Controlled by: Department of Defense
|
|
4
|
+
# CUI Category: CTI
|
|
5
|
+
# Distribution: D
|
|
6
|
+
# POC: ICDEV System Administrator
|
|
7
|
+
"""AI Advisor — Dual-ranked compliance improvement recommendations.
|
|
8
|
+
|
|
9
|
+
Analyzes audit results and generates prioritized recommendations ranked
|
|
10
|
+
by both impact (biggest score increase) and effort (easiest to implement).
|
|
11
|
+
Combined view shows optimal path to improve compliance posture.
|
|
12
|
+
|
|
13
|
+
LLM routing:
|
|
14
|
+
- Scanner tier: deterministic control-to-recommendation mapping (air-gap safe)
|
|
15
|
+
- Worker tier: nuanced advice for complex multi-control gaps (LLM-assisted)
|
|
16
|
+
|
|
17
|
+
Usage:
|
|
18
|
+
python tools/audit_engine/ai_advisor.py --audit-file result.json --json
|
|
19
|
+
python tools/audit_engine/ai_advisor.py --audit-file result.json --regime nist_800_53 --json
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
import json
|
|
23
|
+
import sys
|
|
24
|
+
from datetime import datetime, timezone
|
|
25
|
+
from pathlib import Path
|
|
26
|
+
from typing import Dict, List, Optional
|
|
27
|
+
|
|
28
|
+
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
|
29
|
+
|
|
30
|
+
# Effort levels: lower = easier to implement
|
|
31
|
+
EFFORT_LEVELS = {
|
|
32
|
+
"config_change": 1, # Change a YAML/config setting
|
|
33
|
+
"add_file": 2, # Add a missing file (e.g., .gitignore, SECURITY.md)
|
|
34
|
+
"code_annotation": 3, # Add CUI markings, comments, decorators
|
|
35
|
+
"tool_enable": 4, # Enable an existing tool/scanner
|
|
36
|
+
"code_pattern": 5, # Add logging, error handling patterns
|
|
37
|
+
"feature_add": 6, # Implement new feature (auth, encryption)
|
|
38
|
+
"architecture": 7, # Architectural change (boundary, mesh)
|
|
39
|
+
"process_change": 8, # Organizational/process change
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
# Control-family to recommendation mapping (deterministic, scanner-tier)
|
|
43
|
+
RECOMMENDATION_CATALOG = {
|
|
44
|
+
# Access Control
|
|
45
|
+
"AC-2": {
|
|
46
|
+
"title": "Implement account management lifecycle",
|
|
47
|
+
"description": "Add user provisioning, de-provisioning, and periodic review processes. "
|
|
48
|
+
"Use RBAC with role assignment and session management.",
|
|
49
|
+
"effort": "feature_add",
|
|
50
|
+
"impact": "high",
|
|
51
|
+
"steps": [
|
|
52
|
+
"Add user role definitions in config (args/)",
|
|
53
|
+
"Implement login/session management with timeout",
|
|
54
|
+
"Add account lockout after failed attempts",
|
|
55
|
+
"Create periodic access review automation",
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
"AC-3": {
|
|
59
|
+
"title": "Add access enforcement (RBAC/ABAC)",
|
|
60
|
+
"description": "Implement role-based or attribute-based access control "
|
|
61
|
+
"on all protected endpoints and resources.",
|
|
62
|
+
"effort": "feature_add",
|
|
63
|
+
"impact": "high",
|
|
64
|
+
"steps": [
|
|
65
|
+
"Define roles and permissions in configuration",
|
|
66
|
+
"Add @require_auth / @require_role decorators to endpoints",
|
|
67
|
+
"Implement permission checking middleware",
|
|
68
|
+
"Test with least-privilege scenarios",
|
|
69
|
+
],
|
|
70
|
+
},
|
|
71
|
+
"AC-6": {
|
|
72
|
+
"title": "Enforce least privilege",
|
|
73
|
+
"description": "Run services as non-root, use read-only filesystems, "
|
|
74
|
+
"minimize permissions granted to each component.",
|
|
75
|
+
"effort": "config_change",
|
|
76
|
+
"impact": "medium",
|
|
77
|
+
"steps": [
|
|
78
|
+
"Set containers to run as non-root user",
|
|
79
|
+
"Apply read-only root filesystem in K8s pods",
|
|
80
|
+
"Remove unnecessary capabilities",
|
|
81
|
+
"Review and minimize IAM permissions",
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
"AC-16": {
|
|
85
|
+
"title": "Add CUI classification markings",
|
|
86
|
+
"description": "Apply CUI // SP-CTI header markings to all source files "
|
|
87
|
+
"per NIST 800-53 AC-16.",
|
|
88
|
+
"effort": "code_annotation",
|
|
89
|
+
"impact": "medium",
|
|
90
|
+
"steps": [
|
|
91
|
+
"Run: python tools/compliance/cui_marker.py --file <path> --marking 'CUI // SP-CTI'",
|
|
92
|
+
"Add CUI header template to file scaffolding tools",
|
|
93
|
+
"Verify with: python tools/audit_engine/scanner.py --target . --json",
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
|
|
97
|
+
# Audit and Accountability
|
|
98
|
+
"AU-2": {
|
|
99
|
+
"title": "Implement event logging framework",
|
|
100
|
+
"description": "Add structured logging for security-relevant events including "
|
|
101
|
+
"authentication, authorization, data access, and administrative actions.",
|
|
102
|
+
"effort": "code_pattern",
|
|
103
|
+
"impact": "high",
|
|
104
|
+
"steps": [
|
|
105
|
+
"Import and configure Python logging module",
|
|
106
|
+
"Log authentication events (login, logout, failed attempts)",
|
|
107
|
+
"Log authorization decisions (access granted/denied)",
|
|
108
|
+
"Log data modification events (create, update, delete)",
|
|
109
|
+
],
|
|
110
|
+
},
|
|
111
|
+
"AU-9": {
|
|
112
|
+
"title": "Protect audit trail integrity",
|
|
113
|
+
"description": "Ensure audit logs are append-only and cannot be modified or deleted. "
|
|
114
|
+
"ICDEV already uses append-only audit_trail table (D6).",
|
|
115
|
+
"effort": "config_change",
|
|
116
|
+
"impact": "high",
|
|
117
|
+
"steps": [
|
|
118
|
+
"Verify no UPDATE/DELETE on audit tables",
|
|
119
|
+
"Enable WAL mode for audit database",
|
|
120
|
+
"Add audit log backup/rotation",
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
|
|
124
|
+
# Configuration Management
|
|
125
|
+
"CM-8": {
|
|
126
|
+
"title": "Generate Software Bill of Materials",
|
|
127
|
+
"description": "Generate CycloneDX SBOM for full component inventory.",
|
|
128
|
+
"effort": "tool_enable",
|
|
129
|
+
"impact": "medium",
|
|
130
|
+
"steps": [
|
|
131
|
+
"Run: python tools/compliance/sbom_generator.py --project-id <id> --project-dir .",
|
|
132
|
+
"Add SBOM generation to CI/CD pipeline",
|
|
133
|
+
"Review components for license compliance",
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
|
|
137
|
+
# Identification and Authentication
|
|
138
|
+
"IA-5": {
|
|
139
|
+
"title": "Remove hardcoded secrets",
|
|
140
|
+
"description": "Eliminate all hardcoded passwords, API keys, and tokens from source code. "
|
|
141
|
+
"Use environment variables or secrets manager.",
|
|
142
|
+
"effort": "code_pattern",
|
|
143
|
+
"impact": "critical",
|
|
144
|
+
"steps": [
|
|
145
|
+
"Run: python tools/security/secret_detector.py --project-dir .",
|
|
146
|
+
"Move secrets to .env (excluded from git) or K8s secrets",
|
|
147
|
+
"Use os.environ.get() for all credential access",
|
|
148
|
+
"Add .env to .gitignore",
|
|
149
|
+
],
|
|
150
|
+
},
|
|
151
|
+
|
|
152
|
+
# Risk Assessment
|
|
153
|
+
"RA-5": {
|
|
154
|
+
"title": "Enable vulnerability scanning pipeline",
|
|
155
|
+
"description": "Activate SAST and dependency scanning in CI/CD.",
|
|
156
|
+
"effort": "tool_enable",
|
|
157
|
+
"impact": "high",
|
|
158
|
+
"steps": [
|
|
159
|
+
"Run: python tools/security/sast_runner.py --project-dir .",
|
|
160
|
+
"Run: python tools/security/dependency_auditor.py --project-dir .",
|
|
161
|
+
"Add both to CI/CD pipeline (pre-merge gate)",
|
|
162
|
+
"Set thresholds: 0 critical, 0 high allowed",
|
|
163
|
+
],
|
|
164
|
+
},
|
|
165
|
+
|
|
166
|
+
# System and Services Acquisition
|
|
167
|
+
"SA-8": {
|
|
168
|
+
"title": "Apply Secure by Design principles",
|
|
169
|
+
"description": "Run CISA SbD assessment and address findings.",
|
|
170
|
+
"effort": "code_pattern",
|
|
171
|
+
"impact": "medium",
|
|
172
|
+
"steps": [
|
|
173
|
+
"Run: python tools/compliance/sbd_assessor.py --project-id <id> --project-dir . --json",
|
|
174
|
+
"Address each SbD requirement with evidence",
|
|
175
|
+
"Register exceptions for any accepted risks",
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
"SA-11": {
|
|
179
|
+
"title": "Add automated developer testing",
|
|
180
|
+
"description": "Implement test suite with unit tests, integration tests, and SAST.",
|
|
181
|
+
"effort": "feature_add",
|
|
182
|
+
"impact": "high",
|
|
183
|
+
"steps": [
|
|
184
|
+
"Create tests/ directory with pytest test files",
|
|
185
|
+
"Add test coverage for critical paths (auth, data access)",
|
|
186
|
+
"Enable SAST in CI/CD pipeline",
|
|
187
|
+
"Set minimum coverage threshold (e.g., 80%)",
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
|
|
191
|
+
# System and Communications Protection
|
|
192
|
+
"SC-8": {
|
|
193
|
+
"title": "Enable encryption in transit",
|
|
194
|
+
"description": "Configure TLS for all network communications.",
|
|
195
|
+
"effort": "config_change",
|
|
196
|
+
"impact": "high",
|
|
197
|
+
"steps": [
|
|
198
|
+
"Enable HTTPS on all web endpoints",
|
|
199
|
+
"Configure TLS certificates (Let's Encrypt or CA-signed)",
|
|
200
|
+
"Enforce HSTS headers",
|
|
201
|
+
"Disable HTTP fallback",
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
"SC-13": {
|
|
205
|
+
"title": "Use FIPS-validated cryptography",
|
|
206
|
+
"description": "Replace non-standard crypto with FIPS 140-3 validated modules.",
|
|
207
|
+
"effort": "code_pattern",
|
|
208
|
+
"impact": "high",
|
|
209
|
+
"steps": [
|
|
210
|
+
"Use hashlib (SHA-256/384/512) for hashing",
|
|
211
|
+
"Use cryptography library with FIPS-validated backend",
|
|
212
|
+
"Avoid MD5, SHA-1, DES for security purposes",
|
|
213
|
+
"Document crypto inventory",
|
|
214
|
+
],
|
|
215
|
+
},
|
|
216
|
+
|
|
217
|
+
# System and Information Integrity
|
|
218
|
+
"SI-2": {
|
|
219
|
+
"title": "Remediate known vulnerabilities",
|
|
220
|
+
"description": "Update dependencies with known CVEs to patched versions.",
|
|
221
|
+
"effort": "tool_enable",
|
|
222
|
+
"impact": "critical",
|
|
223
|
+
"steps": [
|
|
224
|
+
"Run: python tools/security/dependency_auditor.py --project-dir .",
|
|
225
|
+
"Update packages with known vulnerabilities",
|
|
226
|
+
"Pin dependency versions in requirements.txt",
|
|
227
|
+
"Add dependency audit to CI/CD pipeline",
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
"SI-10": {
|
|
231
|
+
"title": "Add input validation",
|
|
232
|
+
"description": "Validate and sanitize all user inputs at system boundaries.",
|
|
233
|
+
"effort": "code_pattern",
|
|
234
|
+
"impact": "high",
|
|
235
|
+
"steps": [
|
|
236
|
+
"Add input validation on all API endpoints",
|
|
237
|
+
"Use parameterized queries for all SQL",
|
|
238
|
+
"Sanitize HTML output to prevent XSS",
|
|
239
|
+
"Validate file uploads (type, size, content)",
|
|
240
|
+
],
|
|
241
|
+
},
|
|
242
|
+
|
|
243
|
+
# Supply Chain
|
|
244
|
+
"SR-3": {
|
|
245
|
+
"title": "Implement supply chain controls",
|
|
246
|
+
"description": "Document software supply chain with SBOM and dependency auditing.",
|
|
247
|
+
"effort": "tool_enable",
|
|
248
|
+
"impact": "medium",
|
|
249
|
+
"steps": [
|
|
250
|
+
"Generate SBOM: python tools/compliance/sbom_generator.py",
|
|
251
|
+
"Audit dependencies: python tools/security/dependency_auditor.py",
|
|
252
|
+
"Review licenses for compatibility",
|
|
253
|
+
"Add supply chain checks to CI/CD",
|
|
254
|
+
],
|
|
255
|
+
},
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
# Default recommendations for unmapped controls
|
|
259
|
+
DEFAULT_RECOMMENDATION = {
|
|
260
|
+
"title": "Assess and implement control",
|
|
261
|
+
"description": "This control requires manual assessment. Review the control description "
|
|
262
|
+
"and implement appropriate technical or procedural controls.",
|
|
263
|
+
"effort": "process_change",
|
|
264
|
+
"impact": "medium",
|
|
265
|
+
"steps": [
|
|
266
|
+
"Review control requirements in the regime definition",
|
|
267
|
+
"Assess current implementation status",
|
|
268
|
+
"Document implementation plan",
|
|
269
|
+
"Implement and verify",
|
|
270
|
+
],
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
|
|
274
|
+
def generate_recommendations(
|
|
275
|
+
audit_result: Dict,
|
|
276
|
+
regime_id: Optional[str] = None,
|
|
277
|
+
max_recommendations: int = 20,
|
|
278
|
+
use_llm: bool = False,
|
|
279
|
+
) -> Dict:
|
|
280
|
+
"""Generate prioritized recommendations from audit results.
|
|
281
|
+
|
|
282
|
+
Args:
|
|
283
|
+
audit_result: Full audit result from engine.run_audit().
|
|
284
|
+
regime_id: Optional filter to single regime.
|
|
285
|
+
max_recommendations: Maximum recommendations to return.
|
|
286
|
+
use_llm: Whether to use LLM for nuanced recommendations.
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
Dict with impact-ranked and effort-ranked recommendation lists.
|
|
290
|
+
"""
|
|
291
|
+
regime_scores = audit_result.get("regime_scores", {})
|
|
292
|
+
|
|
293
|
+
if regime_id:
|
|
294
|
+
regimes_to_analyze = {regime_id: regime_scores.get(regime_id, {})}
|
|
295
|
+
else:
|
|
296
|
+
regimes_to_analyze = regime_scores
|
|
297
|
+
|
|
298
|
+
all_recs = []
|
|
299
|
+
seen_controls = set()
|
|
300
|
+
|
|
301
|
+
for rid, scores in regimes_to_analyze.items():
|
|
302
|
+
if "error" in scores:
|
|
303
|
+
continue
|
|
304
|
+
|
|
305
|
+
for category in scores.get("categories", []):
|
|
306
|
+
for ctrl in category.get("controls", []):
|
|
307
|
+
if ctrl["status"] in ("fail", "not_assessed", "partial"):
|
|
308
|
+
ctrl_id = ctrl["control_id"]
|
|
309
|
+
|
|
310
|
+
# Deduplicate across regimes (same control, same recommendation)
|
|
311
|
+
base_ctrl = ctrl_id.split("-")[0] + "-" + ctrl_id.split("-")[1] if "-" in ctrl_id else ctrl_id
|
|
312
|
+
if base_ctrl in seen_controls:
|
|
313
|
+
continue
|
|
314
|
+
seen_controls.add(base_ctrl)
|
|
315
|
+
|
|
316
|
+
rec = _get_recommendation(ctrl_id, ctrl, rid)
|
|
317
|
+
rec["regime_id"] = rid
|
|
318
|
+
rec["control_id"] = ctrl_id
|
|
319
|
+
rec["control_title"] = ctrl.get("title", "")
|
|
320
|
+
rec["current_status"] = ctrl["status"]
|
|
321
|
+
rec["severity"] = ctrl.get("severity", "medium")
|
|
322
|
+
all_recs.append(rec)
|
|
323
|
+
|
|
324
|
+
# Calculate impact scores (how much each fix moves the overall score)
|
|
325
|
+
for rec in all_recs:
|
|
326
|
+
rec["impact_score"] = _calculate_impact_score(rec)
|
|
327
|
+
rec["effort_score"] = EFFORT_LEVELS.get(rec.get("effort", "process_change"), 8)
|
|
328
|
+
# Combined score: high impact + low effort = best ROI
|
|
329
|
+
rec["roi_score"] = rec["impact_score"] / max(rec["effort_score"], 1)
|
|
330
|
+
|
|
331
|
+
# LLM-enhanced recommendations (worker tier)
|
|
332
|
+
if use_llm and all_recs:
|
|
333
|
+
all_recs = _enhance_with_llm(all_recs, audit_result)
|
|
334
|
+
|
|
335
|
+
# Sort by different rankings
|
|
336
|
+
impact_ranked = sorted(all_recs, key=lambda r: r["impact_score"], reverse=True)[:max_recommendations]
|
|
337
|
+
effort_ranked = sorted(all_recs, key=lambda r: r["effort_score"])[:max_recommendations]
|
|
338
|
+
roi_ranked = sorted(all_recs, key=lambda r: r["roi_score"], reverse=True)[:max_recommendations]
|
|
339
|
+
|
|
340
|
+
# Estimate score improvement if top 5 ROI fixes are applied
|
|
341
|
+
estimated_improvement = sum(r["impact_score"] for r in roi_ranked[:5])
|
|
342
|
+
|
|
343
|
+
return {
|
|
344
|
+
"success": True,
|
|
345
|
+
"total_recommendations": len(all_recs),
|
|
346
|
+
"estimated_improvement_top5": round(min(estimated_improvement, 30), 1),
|
|
347
|
+
"by_impact": [_format_rec(r, rank + 1) for rank, r in enumerate(impact_ranked)],
|
|
348
|
+
"by_effort": [_format_rec(r, rank + 1) for rank, r in enumerate(effort_ranked)],
|
|
349
|
+
"by_roi": [_format_rec(r, rank + 1) for rank, r in enumerate(roi_ranked)],
|
|
350
|
+
"quick_wins": [
|
|
351
|
+
_format_rec(r, i + 1) for i, r in enumerate(roi_ranked)
|
|
352
|
+
if r["effort_score"] <= 3
|
|
353
|
+
][:5],
|
|
354
|
+
"timestamp": datetime.now(timezone.utc).isoformat(),
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
|
|
358
|
+
def _get_recommendation(ctrl_id: str, ctrl_data: Dict, regime_id: str) -> Dict:
|
|
359
|
+
"""Get recommendation for a control from the catalog."""
|
|
360
|
+
# Direct match
|
|
361
|
+
if ctrl_id in RECOMMENDATION_CATALOG:
|
|
362
|
+
return dict(RECOMMENDATION_CATALOG[ctrl_id])
|
|
363
|
+
|
|
364
|
+
# Family match (e.g., AC-2(1) -> AC-2)
|
|
365
|
+
base = ctrl_id.split("(")[0] if "(" in ctrl_id else ctrl_id
|
|
366
|
+
if base in RECOMMENDATION_CATALOG:
|
|
367
|
+
return dict(RECOMMENDATION_CATALOG[base])
|
|
368
|
+
|
|
369
|
+
# NIST family prefix match
|
|
370
|
+
family = ctrl_id.split("-")[0] if "-" in ctrl_id else ""
|
|
371
|
+
family_recs = {k: v for k, v in RECOMMENDATION_CATALOG.items() if k.startswith(family + "-")}
|
|
372
|
+
if family_recs:
|
|
373
|
+
# Return the first family match as a starting point
|
|
374
|
+
rec = dict(next(iter(family_recs.values())))
|
|
375
|
+
rec["title"] = f"Address {ctrl_id}: {ctrl_data.get('title', '')}"
|
|
376
|
+
return rec
|
|
377
|
+
|
|
378
|
+
# Default
|
|
379
|
+
rec = dict(DEFAULT_RECOMMENDATION)
|
|
380
|
+
rec["title"] = f"Implement {ctrl_id}: {ctrl_data.get('title', '')}"
|
|
381
|
+
return rec
|
|
382
|
+
|
|
383
|
+
|
|
384
|
+
def _calculate_impact_score(rec: Dict) -> float:
|
|
385
|
+
"""Calculate the score impact of fixing this control.
|
|
386
|
+
|
|
387
|
+
Higher score = fixing this control improves posture more.
|
|
388
|
+
"""
|
|
389
|
+
severity_weights = {"critical": 10, "high": 7, "medium": 4, "low": 2}
|
|
390
|
+
status_weights = {"fail": 1.0, "not_assessed": 0.8, "partial": 0.5}
|
|
391
|
+
|
|
392
|
+
severity = rec.get("severity", "medium")
|
|
393
|
+
status = rec.get("current_status", "fail")
|
|
394
|
+
|
|
395
|
+
base = severity_weights.get(severity, 4)
|
|
396
|
+
multiplier = status_weights.get(status, 1.0)
|
|
397
|
+
|
|
398
|
+
return round(base * multiplier, 1)
|
|
399
|
+
|
|
400
|
+
|
|
401
|
+
def _format_rec(rec: Dict, rank: int) -> Dict:
|
|
402
|
+
"""Format a recommendation for output."""
|
|
403
|
+
effort_labels = {
|
|
404
|
+
1: "Quick config change",
|
|
405
|
+
2: "Add a file",
|
|
406
|
+
3: "Code annotations",
|
|
407
|
+
4: "Enable a tool",
|
|
408
|
+
5: "Add code patterns",
|
|
409
|
+
6: "New feature",
|
|
410
|
+
7: "Architecture change",
|
|
411
|
+
8: "Process change",
|
|
412
|
+
}
|
|
413
|
+
return {
|
|
414
|
+
"rank": rank,
|
|
415
|
+
"control_id": rec.get("control_id", ""),
|
|
416
|
+
"control_title": rec.get("control_title", ""),
|
|
417
|
+
"regime_id": rec.get("regime_id", ""),
|
|
418
|
+
"severity": rec.get("severity", ""),
|
|
419
|
+
"current_status": rec.get("current_status", ""),
|
|
420
|
+
"title": rec.get("title", ""),
|
|
421
|
+
"description": rec.get("description", ""),
|
|
422
|
+
"effort_level": rec.get("effort_score", 8),
|
|
423
|
+
"effort_label": effort_labels.get(rec.get("effort_score", 8), "Process change"),
|
|
424
|
+
"impact_score": rec.get("impact_score", 0),
|
|
425
|
+
"roi_score": round(rec.get("roi_score", 0), 2),
|
|
426
|
+
"steps": rec.get("steps", []),
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
|
|
430
|
+
def _enhance_with_llm(recs: List[Dict], audit_result: Dict) -> List[Dict]:
|
|
431
|
+
"""Enhance recommendations using LLM (worker tier).
|
|
432
|
+
|
|
433
|
+
Uses two-tier routing: qwen3.5 drafts, Claude reviews.
|
|
434
|
+
Only called for complex multi-control gaps.
|
|
435
|
+
"""
|
|
436
|
+
try:
|
|
437
|
+
from tools.llm.router import LLMRouter
|
|
438
|
+
router = LLMRouter()
|
|
439
|
+
|
|
440
|
+
# Only enhance top 5 by impact (to conserve tokens)
|
|
441
|
+
top_recs = sorted(recs, key=lambda r: r.get("impact_score", 0), reverse=True)[:5]
|
|
442
|
+
|
|
443
|
+
context = {
|
|
444
|
+
"target_type": audit_result.get("target_type", "unknown"),
|
|
445
|
+
"failing_controls": [
|
|
446
|
+
{"id": r["control_id"], "title": r.get("control_title", ""),
|
|
447
|
+
"severity": r.get("severity", ""), "status": r["current_status"]}
|
|
448
|
+
for r in top_recs
|
|
449
|
+
],
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
prompt = (
|
|
453
|
+
f"You are a compliance advisor. Given these failing controls for a "
|
|
454
|
+
f"{context['target_type']} target, provide specific, actionable next steps "
|
|
455
|
+
f"for each. Be concise (2-3 sentences per control).\n\n"
|
|
456
|
+
f"Failing controls:\n{json.dumps(context['failing_controls'], indent=2)}\n\n"
|
|
457
|
+
f"For each control, provide: (1) the single most impactful fix, "
|
|
458
|
+
f"(2) estimated effort in hours."
|
|
459
|
+
)
|
|
460
|
+
|
|
461
|
+
response = router.invoke("compliance_export", {
|
|
462
|
+
"prompt": prompt,
|
|
463
|
+
"max_tokens": 1000,
|
|
464
|
+
})
|
|
465
|
+
|
|
466
|
+
if response and response.get("content"):
|
|
467
|
+
# Append LLM insight to recommendation descriptions
|
|
468
|
+
for rec in top_recs:
|
|
469
|
+
rec["ai_insight"] = response["content"][:200]
|
|
470
|
+
rec["ai_enhanced"] = True
|
|
471
|
+
|
|
472
|
+
except (ImportError, Exception) as e:
|
|
473
|
+
# LLM not available — deterministic recommendations still work
|
|
474
|
+
pass
|
|
475
|
+
|
|
476
|
+
return recs
|
|
477
|
+
|
|
478
|
+
|
|
479
|
+
def generate_action_plans(audit_result: Dict) -> Dict:
|
|
480
|
+
"""Generate concrete action plans for regimes scoring below 80%.
|
|
481
|
+
|
|
482
|
+
Each plan includes phased steps, ownership assignments, timeline,
|
|
483
|
+
and expected score improvement per phase.
|
|
484
|
+
"""
|
|
485
|
+
plans = {}
|
|
486
|
+
if not audit_result or not audit_result.get("regime_scores"):
|
|
487
|
+
return {"plans": plans, "regimes_below_threshold": 0}
|
|
488
|
+
|
|
489
|
+
for regime_id, regime_data in audit_result["regime_scores"].items():
|
|
490
|
+
if regime_data.get("error"):
|
|
491
|
+
continue
|
|
492
|
+
score = regime_data.get("overall_score", 0)
|
|
493
|
+
if score >= 80:
|
|
494
|
+
continue # Only plan for <80%
|
|
495
|
+
|
|
496
|
+
# Collect all failing controls for this regime
|
|
497
|
+
# Include not_assessed — they count as failed in scoring
|
|
498
|
+
failing = []
|
|
499
|
+
for cat in regime_data.get("categories", []):
|
|
500
|
+
for ctrl in cat.get("controls", []):
|
|
501
|
+
if ctrl.get("status") in ("fail", "partial", "not_assessed"):
|
|
502
|
+
failing.append({
|
|
503
|
+
"control_id": ctrl.get("control_id", ""),
|
|
504
|
+
"control_name": ctrl.get("control_name", ctrl.get("title", "")),
|
|
505
|
+
"status": ctrl.get("status"),
|
|
506
|
+
"category": cat.get("category_name", ""),
|
|
507
|
+
"severity": ctrl.get("severity", "medium"),
|
|
508
|
+
})
|
|
509
|
+
|
|
510
|
+
total = regime_data.get("summary", {}).get("total_controls", len(failing))
|
|
511
|
+
passed = regime_data.get("summary", {}).get("passed", 0)
|
|
512
|
+
|
|
513
|
+
# Sort by severity (critical first) then by auto-fixable
|
|
514
|
+
sev_order = {"critical": 0, "high": 1, "medium": 2, "low": 3}
|
|
515
|
+
failing.sort(key=lambda f: sev_order.get(f["severity"], 2))
|
|
516
|
+
|
|
517
|
+
# Build phased plan
|
|
518
|
+
phases = []
|
|
519
|
+
|
|
520
|
+
# Phase 1: Quick wins (auto-fixable)
|
|
521
|
+
auto_fixable = [
|
|
522
|
+
f for f in failing
|
|
523
|
+
if _has_auto_fix(f["control_id"])
|
|
524
|
+
]
|
|
525
|
+
manual_only = [
|
|
526
|
+
f for f in failing
|
|
527
|
+
if not _has_auto_fix(f["control_id"])
|
|
528
|
+
]
|
|
529
|
+
|
|
530
|
+
if auto_fixable:
|
|
531
|
+
phase1_controls = auto_fixable # No cap — include all auto-fixable
|
|
532
|
+
new_score_after_p1 = min(100, ((passed + len(phase1_controls)) / max(total, 1)) * 100)
|
|
533
|
+
phases.append({
|
|
534
|
+
"phase": 1,
|
|
535
|
+
"name": "Quick Wins (Auto-Fixable)",
|
|
536
|
+
"timeline": "1-2 weeks",
|
|
537
|
+
"effort": "Low",
|
|
538
|
+
"owner": "Development Team",
|
|
539
|
+
"controls": [
|
|
540
|
+
{
|
|
541
|
+
"control_id": c["control_id"],
|
|
542
|
+
"control_name": c["control_name"],
|
|
543
|
+
"action": _get_fix_description(c["control_id"]),
|
|
544
|
+
"auto_fixable": True,
|
|
545
|
+
}
|
|
546
|
+
for c in phase1_controls
|
|
547
|
+
],
|
|
548
|
+
"expected_score_after": round(new_score_after_p1, 1),
|
|
549
|
+
"controls_resolved": len(phase1_controls),
|
|
550
|
+
})
|
|
551
|
+
passed += len(phase1_controls)
|
|
552
|
+
|
|
553
|
+
# Phase 2: Critical & high severity manual controls
|
|
554
|
+
phase2_controls = [f for f in manual_only if f["severity"] in ("critical", "high")]
|
|
555
|
+
if phase2_controls:
|
|
556
|
+
new_score_after_p2 = min(100, ((passed + len(phase2_controls)) / max(total, 1)) * 100)
|
|
557
|
+
phases.append({
|
|
558
|
+
"phase": 2,
|
|
559
|
+
"name": "Critical & High Severity Remediation",
|
|
560
|
+
"timeline": "2-6 weeks",
|
|
561
|
+
"effort": "Medium-High",
|
|
562
|
+
"owner": "Security + Development Team",
|
|
563
|
+
"controls": [
|
|
564
|
+
{
|
|
565
|
+
"control_id": c["control_id"],
|
|
566
|
+
"control_name": c["control_name"],
|
|
567
|
+
"action": _get_concrete_action(c["control_id"], c.get("control_name", "")),
|
|
568
|
+
"auto_fixable": False,
|
|
569
|
+
}
|
|
570
|
+
for c in phase2_controls
|
|
571
|
+
],
|
|
572
|
+
"expected_score_after": round(new_score_after_p2, 1),
|
|
573
|
+
"controls_resolved": len(phase2_controls),
|
|
574
|
+
})
|
|
575
|
+
passed += len(phase2_controls)
|
|
576
|
+
|
|
577
|
+
# Phase 3: Medium & low severity controls
|
|
578
|
+
phase3_controls = [f for f in manual_only if f["severity"] in ("medium", "low")]
|
|
579
|
+
if phase3_controls:
|
|
580
|
+
new_score_after_p3 = min(100, ((passed + len(phase3_controls)) / max(total, 1)) * 100)
|
|
581
|
+
phases.append({
|
|
582
|
+
"phase": 3,
|
|
583
|
+
"name": "Medium & Low Severity Hardening",
|
|
584
|
+
"timeline": "1-3 months",
|
|
585
|
+
"effort": "Medium",
|
|
586
|
+
"owner": "Development + Compliance Team",
|
|
587
|
+
"controls": [
|
|
588
|
+
{
|
|
589
|
+
"control_id": c["control_id"],
|
|
590
|
+
"control_name": c["control_name"],
|
|
591
|
+
"action": _get_concrete_action(c["control_id"], c.get("control_name", "")),
|
|
592
|
+
"auto_fixable": False,
|
|
593
|
+
}
|
|
594
|
+
for c in phase3_controls
|
|
595
|
+
],
|
|
596
|
+
"expected_score_after": round(new_score_after_p3, 1),
|
|
597
|
+
"controls_resolved": len(phase3_controls),
|
|
598
|
+
})
|
|
599
|
+
|
|
600
|
+
plans[regime_id] = {
|
|
601
|
+
"regime_id": regime_id,
|
|
602
|
+
"regime_name": regime_data.get("regime_name", regime_id),
|
|
603
|
+
"current_score": round(score, 1),
|
|
604
|
+
"current_grade": regime_data.get("grade", "F"),
|
|
605
|
+
"total_failing": len(failing),
|
|
606
|
+
"total_controls": total,
|
|
607
|
+
"phases": phases,
|
|
608
|
+
"target_score": phases[-1]["expected_score_after"] if phases else score,
|
|
609
|
+
"estimated_timeline": phases[-1]["timeline"] if phases else "N/A",
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
return {
|
|
613
|
+
"plans": plans,
|
|
614
|
+
"regimes_below_threshold": len(plans),
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
|
|
618
|
+
def _has_auto_fix(control_id: str) -> bool:
|
|
619
|
+
"""Check if a control has a direct auto-fix handler.
|
|
620
|
+
|
|
621
|
+
Only returns True for controls that directly match a REMEDIATION_ACTIONS
|
|
622
|
+
key (NIST 800-53 format). Cross-framework controls (CMMC, 800-171, SBD)
|
|
623
|
+
are routed to concrete manual actions instead, since the auto-fix scope
|
|
624
|
+
is narrower than the full control requirement.
|
|
625
|
+
"""
|
|
626
|
+
import re
|
|
627
|
+
from tools.audit_engine.self_heal import REMEDIATION_ACTIONS
|
|
628
|
+
|
|
629
|
+
# Only match direct NIST 800-53 IDs (AC-6, AU-2, etc.)
|
|
630
|
+
m = re.match(r"^([A-Z]{2})-(\d+)", control_id)
|
|
631
|
+
if not m:
|
|
632
|
+
return False # Non-NIST IDs always go to manual phases
|
|
633
|
+
|
|
634
|
+
nist_id = f"{m.group(1)}-{m.group(2)}"
|
|
635
|
+
if nist_id in REMEDIATION_ACTIONS:
|
|
636
|
+
action = REMEDIATION_ACTIONS[nist_id]
|
|
637
|
+
return action.get("action_type") != "manual"
|
|
638
|
+
return False
|
|
639
|
+
|
|
640
|
+
|
|
641
|
+
def _get_fix_description(control_id: str) -> str:
|
|
642
|
+
"""Get the fix description for a control."""
|
|
643
|
+
from tools.audit_engine.self_heal import REMEDIATION_ACTIONS, _extract_control_family
|
|
644
|
+
family = _extract_control_family(control_id)
|
|
645
|
+
if family and family in REMEDIATION_ACTIONS:
|
|
646
|
+
return REMEDIATION_ACTIONS[family].get("description", "Manual assessment required")
|
|
647
|
+
return _get_concrete_action(control_id, "")
|
|
648
|
+
|
|
649
|
+
|
|
650
|
+
# Concrete remediation actions by control domain — specific, actionable steps
|
|
651
|
+
# Maps control ID patterns to ICDEV-specific implementation guidance
|
|
652
|
+
CONCRETE_ACTIONS = {
|
|
653
|
+
# Access Control (AC / 3.1.x)
|
|
654
|
+
"access_control": {
|
|
655
|
+
"keywords": ["access", "authorized", "privilege", "remote", "transaction", "function", "flow"],
|
|
656
|
+
"action": "Implement RBAC in Flask dashboard: add @login_required + role decorators to all routes, "
|
|
657
|
+
"configure session timeout (15 min), add account lockout after 5 failed attempts. "
|
|
658
|
+
"Run: python tools/dashboard/app.py with RBAC_ENABLED=true",
|
|
659
|
+
},
|
|
660
|
+
"least_privilege": {
|
|
661
|
+
"keywords": ["least privilege", "non-privileged", "privileged function"],
|
|
662
|
+
"action": "Add non-root USER to all Dockerfiles, set readOnlyRootFilesystem=true in K8s pod specs, "
|
|
663
|
+
"drop ALL capabilities + add only NET_BIND_SERVICE. "
|
|
664
|
+
"Run: python tools/audit_engine/self_heal.py --control AC-6 --target . --apply",
|
|
665
|
+
},
|
|
666
|
+
"remote_access": {
|
|
667
|
+
"keywords": ["remote access", "remote session"],
|
|
668
|
+
"action": "Enable mTLS for all inter-service communication via service mesh (Istio/Linkerd). "
|
|
669
|
+
"Configure VPN requirement for admin access. Add session recording for privileged sessions. "
|
|
670
|
+
"Run: python tools/devsecops/service_mesh_generator.py --project-id sparkpilot --mesh istio --json",
|
|
671
|
+
},
|
|
672
|
+
"cui_flow": {
|
|
673
|
+
"keywords": ["cui flow", "information flow"],
|
|
674
|
+
"action": "Add CUI boundary markers to all data-at-rest and data-in-transit paths. "
|
|
675
|
+
"Configure network segmentation with default-deny NetworkPolicy. "
|
|
676
|
+
"Run: python tools/devsecops/policy_generator.py --project-id sparkpilot --engine kyverno --json",
|
|
677
|
+
},
|
|
678
|
+
# Audit & Accountability (AU / 3.3.x)
|
|
679
|
+
"audit_logging": {
|
|
680
|
+
"keywords": ["audit", "log", "accountability", "trace", "user accountability"],
|
|
681
|
+
"action": "Add structured JSON logging to all API endpoints (auth events, data access, admin actions). "
|
|
682
|
+
"Configure append-only audit trail (NIST AU compliant — no UPDATE/DELETE). "
|
|
683
|
+
"Run: python tools/audit_engine/self_heal.py --control AU-2 --target . --apply",
|
|
684
|
+
},
|
|
685
|
+
"audit_protection": {
|
|
686
|
+
"keywords": ["protect audit", "audit information", "audit tools"],
|
|
687
|
+
"action": "Enable WAL mode on audit database, set file permissions to 0640, configure audit log rotation "
|
|
688
|
+
"with integrity hashing (SHA-256 per entry). Verify no UPDATE/DELETE on audit_trail table.",
|
|
689
|
+
},
|
|
690
|
+
"audit_correlation": {
|
|
691
|
+
"keywords": ["correlat", "audit record review"],
|
|
692
|
+
"action": "Deploy observability stack: configure OTel tracing with correlation IDs across all services. "
|
|
693
|
+
"Run: python tools/observability/provenance/prov_query.py --entity-id sparkpilot --direction backward --json",
|
|
694
|
+
},
|
|
695
|
+
# Awareness & Training (AT / 3.2.x)
|
|
696
|
+
"training": {
|
|
697
|
+
"keywords": ["training", "awareness", "role-based risk"],
|
|
698
|
+
"action": "Create security training program: document role-based training requirements in docs/security-training.md, "
|
|
699
|
+
"add training completion tracking to user profiles, schedule quarterly security awareness reviews.",
|
|
700
|
+
},
|
|
701
|
+
# Configuration Management (CM / 3.4.x)
|
|
702
|
+
"baseline_config": {
|
|
703
|
+
"keywords": ["baseline", "configuration setting", "change track", "change control"],
|
|
704
|
+
"action": "Generate baseline config with checksums: document all system configs in args/ directory, "
|
|
705
|
+
"add git-based change tracking with mandatory PR reviews. "
|
|
706
|
+
"Run: python tools/compliance/stig_checker.py --project-id sparkpilot to verify STIG compliance.",
|
|
707
|
+
},
|
|
708
|
+
# Identification & Authentication (IA / 3.5.x)
|
|
709
|
+
"authentication": {
|
|
710
|
+
"keywords": ["identif", "authenticat", "multifactor", "mfa"],
|
|
711
|
+
"action": "Implement authentication: add Flask-Login with bcrypt password hashing, enforce MFA via TOTP "
|
|
712
|
+
"(pyotp library), require strong passwords (12+ chars, complexity). "
|
|
713
|
+
"Add API key rotation with 90-day expiry.",
|
|
714
|
+
},
|
|
715
|
+
# Incident Response (IR / 3.6.x)
|
|
716
|
+
"incident_response": {
|
|
717
|
+
"keywords": ["incident"],
|
|
718
|
+
"action": "Create incident response plan: docs/incident-response-plan.md with detection/analysis/containment/"
|
|
719
|
+
"eradication/recovery phases. Add automated alerting via monitor agent. "
|
|
720
|
+
"Run: python tools/security/threat_modeler.py --project-id sparkpilot --create --name 'IR Plan' --json",
|
|
721
|
+
},
|
|
722
|
+
# Maintenance (MA / 3.7.x)
|
|
723
|
+
"maintenance": {
|
|
724
|
+
"keywords": ["maintenance"],
|
|
725
|
+
"action": "Document maintenance procedures: schedule dependency updates (monthly), automate with "
|
|
726
|
+
"python tools/security/dependency_auditor.py in CI/CD. Add maintenance window calendar.",
|
|
727
|
+
},
|
|
728
|
+
# Media Protection (MP / 3.8.x)
|
|
729
|
+
"media_protection": {
|
|
730
|
+
"keywords": ["media protection", "media sanitiz"],
|
|
731
|
+
"action": "Implement data-at-rest encryption for all CUI storage (AES-256). Add secure deletion procedures. "
|
|
732
|
+
"Document media handling in docs/media-protection.md.",
|
|
733
|
+
},
|
|
734
|
+
# Physical (PE / 3.10.x)
|
|
735
|
+
"physical": {
|
|
736
|
+
"keywords": ["physical"],
|
|
737
|
+
"action": "Document physical security controls for deployment environment: data center access controls, "
|
|
738
|
+
"visitor logs, environmental protections. For cloud: reference AWS GovCloud physical security inheritance.",
|
|
739
|
+
},
|
|
740
|
+
# Personnel Security (PS / 3.9.x)
|
|
741
|
+
"personnel": {
|
|
742
|
+
"keywords": ["personnel", "screen individual"],
|
|
743
|
+
"action": "Document personnel screening requirements: background checks for CUI access, "
|
|
744
|
+
"access termination procedures within 24 hours of departure, NDA requirements.",
|
|
745
|
+
},
|
|
746
|
+
# Risk Assessment (RA / 3.11.x)
|
|
747
|
+
"risk_assessment": {
|
|
748
|
+
"keywords": ["risk assess", "vulnerability scan"],
|
|
749
|
+
"action": "Enable automated vulnerability scanning in CI/CD pipeline: "
|
|
750
|
+
"python tools/security/sast_runner.py + python tools/security/dependency_auditor.py. "
|
|
751
|
+
"Schedule quarterly risk assessments. "
|
|
752
|
+
"Run: python tools/compliance/sbd_assessor.py --project-id sparkpilot --project-dir . --json",
|
|
753
|
+
},
|
|
754
|
+
# Recovery (RE / 3.12.x)
|
|
755
|
+
"recovery": {
|
|
756
|
+
"keywords": ["backup", "recovery", "data backup"],
|
|
757
|
+
"action": "Configure automated database backups (daily with 30-day retention). Test restore procedures monthly. "
|
|
758
|
+
"Document backup/recovery plan in docs/backup-recovery.md. Add backup verification checksums.",
|
|
759
|
+
},
|
|
760
|
+
# System & Comms Protection (SC / 3.13.x)
|
|
761
|
+
"boundary_protection": {
|
|
762
|
+
"keywords": ["boundary", "boundary protect"],
|
|
763
|
+
"action": "Configure network segmentation: deploy default-deny NetworkPolicy, enable WAF for web endpoints, "
|
|
764
|
+
"configure egress filtering. "
|
|
765
|
+
"Run: python tools/devsecops/policy_generator.py --project-id sparkpilot --engine kyverno --json",
|
|
766
|
+
},
|
|
767
|
+
"encryption": {
|
|
768
|
+
"keywords": ["encrypt", "cryptograph", "fips", "cui in transit"],
|
|
769
|
+
"action": "Enable TLS 1.3 on all endpoints, configure FIPS 140-3 validated crypto (Python cryptography library), "
|
|
770
|
+
"encrypt CUI at rest with AES-256-GCM. Add HSTS headers. "
|
|
771
|
+
"Run: python tools/audit_engine/self_heal.py --control SC-13 --target . --apply",
|
|
772
|
+
},
|
|
773
|
+
# System & Info Integrity (SI / 3.14.x)
|
|
774
|
+
"flaw_remediation": {
|
|
775
|
+
"keywords": ["flaw", "remediat", "patch"],
|
|
776
|
+
"action": "Run dependency audit and update all packages with known CVEs: "
|
|
777
|
+
"python tools/security/dependency_auditor.py --project-dir . "
|
|
778
|
+
"Pin versions in requirements.txt, add Dependabot/Renovate for automated PR updates.",
|
|
779
|
+
},
|
|
780
|
+
"malicious_code": {
|
|
781
|
+
"keywords": ["malicious code", "malware"],
|
|
782
|
+
"action": "Enable SAST scanning in CI/CD to detect code injection patterns. Add pre-commit hooks for "
|
|
783
|
+
"secret detection. Configure container image scanning. "
|
|
784
|
+
"Run: python tools/security/sast_runner.py --project-dir .",
|
|
785
|
+
},
|
|
786
|
+
"monitoring": {
|
|
787
|
+
"keywords": ["monitor", "unauthorized use", "security alert", "advisory"],
|
|
788
|
+
"action": "Deploy monitoring stack: configure alerting for failed auth attempts (>5/min), "
|
|
789
|
+
"unauthorized API access, anomalous data exfiltration patterns. "
|
|
790
|
+
"Run: python tools/security/ai_telemetry_logger.py --anomalies --window-hours 24 --json",
|
|
791
|
+
},
|
|
792
|
+
# Supply Chain (SR)
|
|
793
|
+
"supply_chain": {
|
|
794
|
+
"keywords": ["supply chain", "sbom", "component"],
|
|
795
|
+
"action": "Generate SBOM and audit supply chain: "
|
|
796
|
+
"python tools/compliance/sbom_generator.py --project-id sparkpilot --project-dir . "
|
|
797
|
+
"Run: python tools/supply_chain/scrm_assessor.py --project-id sparkpilot --aggregate --json",
|
|
798
|
+
},
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
|
|
802
|
+
def _get_concrete_action(control_id: str, control_name: str) -> str:
|
|
803
|
+
"""Get concrete, actionable remediation steps for a control.
|
|
804
|
+
|
|
805
|
+
For NIST 800-53 IDs: uses self-heal REMEDIATION_ACTIONS directly.
|
|
806
|
+
For cross-framework IDs (CMMC, 800-171, SBD): uses keyword matching
|
|
807
|
+
on control name for broader, more accurate remediation guidance.
|
|
808
|
+
"""
|
|
809
|
+
import re
|
|
810
|
+
from tools.audit_engine.self_heal import REMEDIATION_ACTIONS, _extract_control_family
|
|
811
|
+
|
|
812
|
+
# For direct NIST 800-53 IDs, use self-heal actions (precise match)
|
|
813
|
+
is_nist = bool(re.match(r"^[A-Z]{2}-\d+", control_id))
|
|
814
|
+
if is_nist:
|
|
815
|
+
family = _extract_control_family(control_id)
|
|
816
|
+
if family and family in REMEDIATION_ACTIONS:
|
|
817
|
+
return REMEDIATION_ACTIONS[family].get("description", "")
|
|
818
|
+
|
|
819
|
+
# For cross-framework IDs, match by control name keywords first
|
|
820
|
+
name_lower = (control_name or "").lower()
|
|
821
|
+
id_lower = control_id.lower()
|
|
822
|
+
search_text = f"{name_lower} {id_lower}"
|
|
823
|
+
|
|
824
|
+
best_match = None
|
|
825
|
+
best_score = 0
|
|
826
|
+
for _key, entry in CONCRETE_ACTIONS.items():
|
|
827
|
+
score = sum(1 for kw in entry["keywords"] if kw in search_text)
|
|
828
|
+
if score > best_score:
|
|
829
|
+
best_score = score
|
|
830
|
+
best_match = entry
|
|
831
|
+
|
|
832
|
+
if best_match and best_score > 0:
|
|
833
|
+
return best_match["action"]
|
|
834
|
+
|
|
835
|
+
# Fallback: map by NIST family prefix from control ID
|
|
836
|
+
family_to_domain = {
|
|
837
|
+
"AC": "access_control", "AU": "audit_logging", "AT": "training",
|
|
838
|
+
"CM": "baseline_config", "IA": "authentication", "IR": "incident_response",
|
|
839
|
+
"MA": "maintenance", "MP": "media_protection", "PE": "physical",
|
|
840
|
+
"PS": "personnel", "RA": "risk_assessment", "SC": "boundary_protection",
|
|
841
|
+
"SI": "flaw_remediation", "SR": "supply_chain", "CP": "recovery",
|
|
842
|
+
"RE": "recovery",
|
|
843
|
+
}
|
|
844
|
+
family = _extract_control_family(control_id)
|
|
845
|
+
if family:
|
|
846
|
+
prefix = family.split("-")[0] if "-" in family else family
|
|
847
|
+
domain = family_to_domain.get(prefix)
|
|
848
|
+
if domain and domain in CONCRETE_ACTIONS:
|
|
849
|
+
return CONCRETE_ACTIONS[domain]["action"]
|
|
850
|
+
|
|
851
|
+
return ("Review control requirements and implement: (1) document current state, "
|
|
852
|
+
"(2) identify gaps against requirement, (3) implement technical/procedural controls, "
|
|
853
|
+
"(4) collect evidence of implementation, (5) verify with audit rescan")
|
|
854
|
+
|
|
855
|
+
|
|
856
|
+
if __name__ == "__main__":
|
|
857
|
+
import argparse
|
|
858
|
+
|
|
859
|
+
parser = argparse.ArgumentParser(description="Audit AI Advisor")
|
|
860
|
+
parser.add_argument("--audit-file", type=str, help="Audit result JSON file")
|
|
861
|
+
parser.add_argument("--regime", type=str, help="Filter to specific regime")
|
|
862
|
+
parser.add_argument("--max", type=int, default=20, help="Max recommendations")
|
|
863
|
+
parser.add_argument("--use-llm", action="store_true", help="Use LLM for enhanced advice")
|
|
864
|
+
parser.add_argument("--json", action="store_true", help="JSON output")
|
|
865
|
+
args = parser.parse_args()
|
|
866
|
+
|
|
867
|
+
if not args.audit_file:
|
|
868
|
+
# Run a fresh audit
|
|
869
|
+
from tools.audit_engine.engine import run_audit
|
|
870
|
+
audit_result = run_audit(target_path=".", store_results=False)
|
|
871
|
+
else:
|
|
872
|
+
with open(args.audit_file, "r") as f:
|
|
873
|
+
audit_result = json.load(f)
|
|
874
|
+
|
|
875
|
+
result = generate_recommendations(
|
|
876
|
+
audit_result,
|
|
877
|
+
regime_id=args.regime,
|
|
878
|
+
max_recommendations=args.max,
|
|
879
|
+
use_llm=args.use_llm,
|
|
880
|
+
)
|
|
881
|
+
|
|
882
|
+
if args.json:
|
|
883
|
+
print(json.dumps(result, indent=2))
|
|
884
|
+
else:
|
|
885
|
+
print(f"\n{'='*70}")
|
|
886
|
+
print(f" AI ADVISOR — COMPLIANCE IMPROVEMENT RECOMMENDATIONS")
|
|
887
|
+
print(f"{'='*70}")
|
|
888
|
+
print(f" Total: {result['total_recommendations']} recommendations")
|
|
889
|
+
print(f" Est. improvement (top 5): +{result['estimated_improvement_top5']}%\n")
|
|
890
|
+
|
|
891
|
+
print(f" TOP 5 QUICK WINS (best ROI):")
|
|
892
|
+
for rec in result.get("quick_wins", [])[:5]:
|
|
893
|
+
print(f" {rec['rank']}. [{rec['severity'].upper()}] {rec['title']}")
|
|
894
|
+
print(f" Control: {rec['control_id']} | Effort: {rec['effort_label']}")
|
|
895
|
+
print(f" Impact: {rec['impact_score']} | ROI: {rec['roi_score']}")
|
|
896
|
+
print()
|
|
897
|
+
|
|
898
|
+
print(f" TOP 5 BY IMPACT:")
|
|
899
|
+
for rec in result.get("by_impact", [])[:5]:
|
|
900
|
+
print(f" {rec['rank']}. [{rec['severity'].upper()}] {rec['title']}")
|
|
901
|
+
print(f" Control: {rec['control_id']} | Effort: {rec['effort_label']}")
|
|
902
|
+
print()
|
|
903
|
+
|
|
904
|
+
print(f"{'='*70}")
|
|
905
|
+
print(f" CUI // SP-CTI")
|
|
906
|
+
print(f"{'='*70}")
|