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