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,1173 @@
|
|
|
1
|
+
# [TEMPLATE: CUI // SP-CTI]
|
|
2
|
+
#!/usr/bin/env python3
|
|
3
|
+
"""DoDI 5000.87 Digital Engineering Strategy (DES) compliance assessor.
|
|
4
|
+
|
|
5
|
+
Loads DES requirements from context/mbse/des_requirements.json, performs automated
|
|
6
|
+
checks against MBSE database tables (sysml_elements, doors_requirements,
|
|
7
|
+
digital_thread_links, model_code_mappings, model_snapshots, model_imports),
|
|
8
|
+
stores results in des_compliance table, evaluates DES gates, applies CUI markings,
|
|
9
|
+
and logs audit events.
|
|
10
|
+
|
|
11
|
+
Categories assessed:
|
|
12
|
+
model_authority -- DSM as authoritative source of truth
|
|
13
|
+
data_management -- Data standards, exchange formats, repositories
|
|
14
|
+
infrastructure -- DE environment, tools, platforms
|
|
15
|
+
workforce -- Training, competency, organizational adoption
|
|
16
|
+
policy -- Governance, standards compliance, IP management
|
|
17
|
+
lifecycle -- Integration across acquisition lifecycle phases
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import argparse
|
|
21
|
+
import json
|
|
22
|
+
import sys
|
|
23
|
+
from datetime import datetime, timezone
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
from tools.db.storage import get_connection
|
|
26
|
+
DB_PATH = None # Storage layer handles path resolution (D-DB-20)
|
|
27
|
+
|
|
28
|
+
BASE_DIR = Path(__file__).resolve().parent.parent.parent
|
|
29
|
+
DES_REQUIREMENTS_PATH = BASE_DIR / "context" / "mbse" / "des_requirements.json"
|
|
30
|
+
|
|
31
|
+
# Try to import audit logger
|
|
32
|
+
try:
|
|
33
|
+
sys.path.insert(0, str(BASE_DIR / "tools" / "audit"))
|
|
34
|
+
from audit_logger import log_event as _audit_log_event
|
|
35
|
+
except ImportError:
|
|
36
|
+
_audit_log_event = None
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
# -----------------------------------------------------------------
|
|
40
|
+
# Database helpers
|
|
41
|
+
# -----------------------------------------------------------------
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def _ensure_table(conn):
|
|
45
|
+
"""Create des_compliance table if it does not exist."""
|
|
46
|
+
conn.execute("""
|
|
47
|
+
CREATE TABLE IF NOT EXISTS des_compliance (
|
|
48
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
49
|
+
project_id TEXT NOT NULL,
|
|
50
|
+
requirement_id TEXT NOT NULL,
|
|
51
|
+
requirement_title TEXT NOT NULL,
|
|
52
|
+
category TEXT NOT NULL CHECK(category IN (
|
|
53
|
+
'model_authority','data_management','infrastructure',
|
|
54
|
+
'workforce','policy','lifecycle'
|
|
55
|
+
)),
|
|
56
|
+
status TEXT DEFAULT 'not_assessed' CHECK(status IN (
|
|
57
|
+
'not_assessed','compliant','partially_compliant',
|
|
58
|
+
'non_compliant','not_applicable'
|
|
59
|
+
)),
|
|
60
|
+
evidence TEXT,
|
|
61
|
+
automation_result TEXT,
|
|
62
|
+
assessed_at TEXT DEFAULT (datetime('now')),
|
|
63
|
+
notes TEXT,
|
|
64
|
+
UNIQUE(project_id, requirement_id)
|
|
65
|
+
)
|
|
66
|
+
""")
|
|
67
|
+
conn.commit()
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
def _get_project(conn, project_id):
|
|
71
|
+
"""Load project data from the projects table."""
|
|
72
|
+
row = conn.execute(
|
|
73
|
+
"SELECT * FROM projects WHERE id = ?", (project_id,)
|
|
74
|
+
).fetchone()
|
|
75
|
+
if not row:
|
|
76
|
+
raise ValueError(f"Project '{project_id}' not found.")
|
|
77
|
+
return dict(row)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
# -----------------------------------------------------------------
|
|
81
|
+
# Configuration helpers
|
|
82
|
+
# -----------------------------------------------------------------
|
|
83
|
+
|
|
84
|
+
def load_des_requirements(catalog_path=None):
|
|
85
|
+
"""Load DES requirements from context/mbse/des_requirements.json.
|
|
86
|
+
|
|
87
|
+
Args:
|
|
88
|
+
catalog_path: Override path to the DES requirements JSON catalog.
|
|
89
|
+
|
|
90
|
+
Returns:
|
|
91
|
+
list of requirement dicts from the catalog.
|
|
92
|
+
"""
|
|
93
|
+
path = Path(catalog_path) if catalog_path else DES_REQUIREMENTS_PATH
|
|
94
|
+
if not path.exists():
|
|
95
|
+
raise FileNotFoundError(
|
|
96
|
+
f"DES requirements file not found: {path}\n"
|
|
97
|
+
"Expected: context/mbse/des_requirements.json"
|
|
98
|
+
)
|
|
99
|
+
with open(path, "r", encoding="utf-8") as f:
|
|
100
|
+
data = json.load(f)
|
|
101
|
+
return data.get("requirements", [])
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _load_cui_config():
|
|
105
|
+
"""Load CUI marking configuration."""
|
|
106
|
+
try:
|
|
107
|
+
sys.path.insert(0, str(BASE_DIR / "tools" / "compliance"))
|
|
108
|
+
from cui_marker import load_cui_config
|
|
109
|
+
return load_cui_config()
|
|
110
|
+
except ImportError:
|
|
111
|
+
return {
|
|
112
|
+
"document_header": (
|
|
113
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
114
|
+
"CONTROLLED UNCLASSIFIED INFORMATION (CUI) // SP-CTI\n"
|
|
115
|
+
"Distribution: Distribution D -- Authorized DoD Personnel Only\n"
|
|
116
|
+
"////////////////////////////////////////////////////////////////////"
|
|
117
|
+
),
|
|
118
|
+
"document_footer": (
|
|
119
|
+
"////////////////////////////////////////////////////////////////////\n"
|
|
120
|
+
"CUI // SP-CTI | Department of Defense\n"
|
|
121
|
+
"////////////////////////////////////////////////////////////////////"
|
|
122
|
+
),
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _log_audit_event(conn, project_id, action, details, file_path=None):
|
|
127
|
+
"""Log an audit trail event (append-only, NIST AU compliant)."""
|
|
128
|
+
try:
|
|
129
|
+
conn.execute(
|
|
130
|
+
"""INSERT INTO audit_trail
|
|
131
|
+
(project_id, event_type, actor, action, details,
|
|
132
|
+
affected_files, classification)
|
|
133
|
+
VALUES (?, ?, ?, ?, ?, ?, ?)""",
|
|
134
|
+
(
|
|
135
|
+
project_id,
|
|
136
|
+
"des_assessed",
|
|
137
|
+
"icdev-compliance-engine",
|
|
138
|
+
action,
|
|
139
|
+
json.dumps(details),
|
|
140
|
+
json.dumps([str(file_path)] if file_path else []),
|
|
141
|
+
"CUI",
|
|
142
|
+
),
|
|
143
|
+
)
|
|
144
|
+
conn.commit()
|
|
145
|
+
except Exception as e:
|
|
146
|
+
print(f"Warning: Could not log audit event: {e}", file=sys.stderr)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
# -----------------------------------------------------------------
|
|
150
|
+
# Auto-check functions
|
|
151
|
+
# Each returns a dict:
|
|
152
|
+
# {"status": "compliant"|"partially_compliant"|"non_compliant",
|
|
153
|
+
# "evidence": "description of what was found",
|
|
154
|
+
# "details": "specifics"}
|
|
155
|
+
# -----------------------------------------------------------------
|
|
156
|
+
|
|
157
|
+
def _check_model_authority(project_id, project_dir, conn):
|
|
158
|
+
"""DES-1.x: DSM exists and is current.
|
|
159
|
+
|
|
160
|
+
Check sysml_elements count > 0 and last import within 90 days.
|
|
161
|
+
"""
|
|
162
|
+
try:
|
|
163
|
+
row = conn.execute(
|
|
164
|
+
"SELECT COUNT(*) as cnt FROM sysml_elements WHERE project_id = ?",
|
|
165
|
+
(project_id,),
|
|
166
|
+
).fetchone()
|
|
167
|
+
element_count = row["cnt"] if row else 0
|
|
168
|
+
except Exception:
|
|
169
|
+
element_count = 0
|
|
170
|
+
|
|
171
|
+
if element_count == 0:
|
|
172
|
+
return {
|
|
173
|
+
"status": "non_compliant",
|
|
174
|
+
"evidence": "No SysML elements found in sysml_elements table.",
|
|
175
|
+
"details": (
|
|
176
|
+
"The Digital System Model (DSM) does not exist or has no "
|
|
177
|
+
"elements registered. Import a SysML model to establish "
|
|
178
|
+
"the authoritative source of truth."
|
|
179
|
+
),
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
# Check last import within 90 days
|
|
183
|
+
try:
|
|
184
|
+
import_row = conn.execute(
|
|
185
|
+
"""SELECT MAX(imported_at) as last_import
|
|
186
|
+
FROM model_imports WHERE project_id = ?""",
|
|
187
|
+
(project_id,),
|
|
188
|
+
).fetchone()
|
|
189
|
+
last_import_str = import_row["last_import"] if import_row else None
|
|
190
|
+
except Exception:
|
|
191
|
+
last_import_str = None
|
|
192
|
+
|
|
193
|
+
if last_import_str:
|
|
194
|
+
try:
|
|
195
|
+
last_import = datetime.fromisoformat(last_import_str.replace("Z", "+00:00").replace("+00:00", ""))
|
|
196
|
+
except (ValueError, AttributeError):
|
|
197
|
+
last_import = None
|
|
198
|
+
else:
|
|
199
|
+
last_import = None
|
|
200
|
+
|
|
201
|
+
now = datetime.now(timezone.utc)
|
|
202
|
+
if last_import and (now - last_import).days <= 90:
|
|
203
|
+
return {
|
|
204
|
+
"status": "compliant",
|
|
205
|
+
"evidence": (
|
|
206
|
+
f"DSM contains {element_count} element(s). Last import "
|
|
207
|
+
f"{last_import.strftime('%Y-%m-%d')} ({(now - last_import).days}d ago)."
|
|
208
|
+
),
|
|
209
|
+
"details": "Model is current (imported within 90 days).",
|
|
210
|
+
}
|
|
211
|
+
elif last_import:
|
|
212
|
+
return {
|
|
213
|
+
"status": "partially_compliant",
|
|
214
|
+
"evidence": (
|
|
215
|
+
f"DSM contains {element_count} element(s) but last import "
|
|
216
|
+
f"was {last_import.strftime('%Y-%m-%d')} "
|
|
217
|
+
f"({(now - last_import).days}d ago, exceeds 90-day threshold)."
|
|
218
|
+
),
|
|
219
|
+
"details": "Re-import model data to restore currency.",
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return {
|
|
223
|
+
"status": "partially_compliant",
|
|
224
|
+
"evidence": (
|
|
225
|
+
f"DSM contains {element_count} element(s) but no import "
|
|
226
|
+
"records found in model_imports table."
|
|
227
|
+
),
|
|
228
|
+
"details": "Cannot verify model currency without import records.",
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _check_model_completeness(project_id, project_dir, conn):
|
|
233
|
+
"""DES-1.x: All major system elements modeled.
|
|
234
|
+
|
|
235
|
+
Check element types coverage -- blocks, activities, and requirements
|
|
236
|
+
must all be present in sysml_elements.
|
|
237
|
+
"""
|
|
238
|
+
required_types = {"Block", "Activity", "Requirement"}
|
|
239
|
+
try:
|
|
240
|
+
rows = conn.execute(
|
|
241
|
+
"""SELECT DISTINCT element_type FROM sysml_elements
|
|
242
|
+
WHERE project_id = ?""",
|
|
243
|
+
(project_id,),
|
|
244
|
+
).fetchall()
|
|
245
|
+
found_types = {r["element_type"] for r in rows}
|
|
246
|
+
except Exception:
|
|
247
|
+
found_types = set()
|
|
248
|
+
|
|
249
|
+
if not found_types:
|
|
250
|
+
return {
|
|
251
|
+
"status": "non_compliant",
|
|
252
|
+
"evidence": "No element types found in sysml_elements table.",
|
|
253
|
+
"details": (
|
|
254
|
+
"Required element types: Block, Activity, Requirement. "
|
|
255
|
+
"None found."
|
|
256
|
+
),
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
# Normalize type names for comparison (case-insensitive)
|
|
260
|
+
found_lower = {t.lower() for t in found_types}
|
|
261
|
+
required_lower = {t.lower() for t in required_types}
|
|
262
|
+
matched = required_lower & found_lower
|
|
263
|
+
missing = required_lower - found_lower
|
|
264
|
+
|
|
265
|
+
if len(matched) == len(required_lower):
|
|
266
|
+
return {
|
|
267
|
+
"status": "compliant",
|
|
268
|
+
"evidence": (
|
|
269
|
+
f"All required element types present: "
|
|
270
|
+
f"{', '.join(sorted(found_types))}."
|
|
271
|
+
),
|
|
272
|
+
"details": (
|
|
273
|
+
f"Found {len(found_types)} distinct element type(s) "
|
|
274
|
+
f"including all required types (Block, Activity, Requirement)."
|
|
275
|
+
),
|
|
276
|
+
}
|
|
277
|
+
elif matched:
|
|
278
|
+
return {
|
|
279
|
+
"status": "partially_compliant",
|
|
280
|
+
"evidence": (
|
|
281
|
+
f"Found element types: {', '.join(sorted(found_types))}. "
|
|
282
|
+
f"Missing required: {', '.join(sorted(missing))}."
|
|
283
|
+
),
|
|
284
|
+
"details": (
|
|
285
|
+
"Partial model completeness. Add missing element types "
|
|
286
|
+
"to achieve full coverage."
|
|
287
|
+
),
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
return {
|
|
291
|
+
"status": "non_compliant",
|
|
292
|
+
"evidence": (
|
|
293
|
+
f"Found element types: {', '.join(sorted(found_types))}. "
|
|
294
|
+
f"None of the required types (Block, Activity, Requirement) present."
|
|
295
|
+
),
|
|
296
|
+
"details": "Model lacks fundamental structural, behavioral, and requirement elements.",
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def _check_digital_thread(project_id, project_dir, conn):
|
|
301
|
+
"""DES-2.x: End-to-end traceability exists.
|
|
302
|
+
|
|
303
|
+
Check digital_thread_links coverage >= 60%.
|
|
304
|
+
"""
|
|
305
|
+
try:
|
|
306
|
+
total_row = conn.execute(
|
|
307
|
+
"SELECT COUNT(*) as cnt FROM sysml_elements WHERE project_id = ?",
|
|
308
|
+
(project_id,),
|
|
309
|
+
).fetchone()
|
|
310
|
+
total_elements = total_row["cnt"] if total_row else 0
|
|
311
|
+
except Exception:
|
|
312
|
+
total_elements = 0
|
|
313
|
+
|
|
314
|
+
try:
|
|
315
|
+
linked_row = conn.execute(
|
|
316
|
+
"""SELECT COUNT(DISTINCT source_id) as cnt
|
|
317
|
+
FROM digital_thread_links WHERE project_id = ?""",
|
|
318
|
+
(project_id,),
|
|
319
|
+
).fetchone()
|
|
320
|
+
linked_elements = linked_row["cnt"] if linked_row else 0
|
|
321
|
+
except Exception:
|
|
322
|
+
linked_elements = 0
|
|
323
|
+
|
|
324
|
+
if total_elements == 0:
|
|
325
|
+
return {
|
|
326
|
+
"status": "non_compliant",
|
|
327
|
+
"evidence": "No SysML elements found; cannot compute thread coverage.",
|
|
328
|
+
"details": "Import model elements first, then establish digital thread links.",
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
coverage = (linked_elements / total_elements) * 100 if total_elements > 0 else 0.0
|
|
332
|
+
|
|
333
|
+
if coverage >= 60.0:
|
|
334
|
+
return {
|
|
335
|
+
"status": "compliant",
|
|
336
|
+
"evidence": (
|
|
337
|
+
f"Digital thread coverage: {coverage:.1f}% "
|
|
338
|
+
f"({linked_elements}/{total_elements} elements linked)."
|
|
339
|
+
),
|
|
340
|
+
"details": "Meets 60% minimum traceability threshold.",
|
|
341
|
+
}
|
|
342
|
+
elif coverage > 0:
|
|
343
|
+
return {
|
|
344
|
+
"status": "partially_compliant",
|
|
345
|
+
"evidence": (
|
|
346
|
+
f"Digital thread coverage: {coverage:.1f}% "
|
|
347
|
+
f"({linked_elements}/{total_elements} elements linked). "
|
|
348
|
+
"Below 60% threshold."
|
|
349
|
+
),
|
|
350
|
+
"details": "Add traceability links to reach 60% coverage.",
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
return {
|
|
354
|
+
"status": "non_compliant",
|
|
355
|
+
"evidence": (
|
|
356
|
+
f"No digital thread links found for {total_elements} element(s)."
|
|
357
|
+
),
|
|
358
|
+
"details": "No traceability established. Create digital_thread_links entries.",
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
|
|
362
|
+
def _check_model_currency(project_id, project_dir, conn):
|
|
363
|
+
"""DES-2.x: Model updated within current PI.
|
|
364
|
+
|
|
365
|
+
Check model_imports last date is within the past 42 days (approx 1 PI).
|
|
366
|
+
"""
|
|
367
|
+
try:
|
|
368
|
+
row = conn.execute(
|
|
369
|
+
"""SELECT MAX(imported_at) as last_import
|
|
370
|
+
FROM model_imports WHERE project_id = ?""",
|
|
371
|
+
(project_id,),
|
|
372
|
+
).fetchone()
|
|
373
|
+
last_import_str = row["last_import"] if row else None
|
|
374
|
+
except Exception:
|
|
375
|
+
last_import_str = None
|
|
376
|
+
|
|
377
|
+
if not last_import_str:
|
|
378
|
+
return {
|
|
379
|
+
"status": "non_compliant",
|
|
380
|
+
"evidence": "No model import records found.",
|
|
381
|
+
"details": "Cannot verify model currency. Import model data.",
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
try:
|
|
385
|
+
last_import = datetime.fromisoformat(
|
|
386
|
+
last_import_str.replace("Z", "+00:00").replace("+00:00", "")
|
|
387
|
+
)
|
|
388
|
+
except (ValueError, AttributeError):
|
|
389
|
+
return {
|
|
390
|
+
"status": "non_compliant",
|
|
391
|
+
"evidence": f"Invalid import date format: {last_import_str}.",
|
|
392
|
+
"details": "Cannot parse last import timestamp.",
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
now = datetime.now(timezone.utc)
|
|
396
|
+
days_since = (now - last_import).days
|
|
397
|
+
|
|
398
|
+
if days_since <= 42:
|
|
399
|
+
return {
|
|
400
|
+
"status": "compliant",
|
|
401
|
+
"evidence": (
|
|
402
|
+
f"Last model import: {last_import.strftime('%Y-%m-%d')} "
|
|
403
|
+
f"({days_since}d ago). Within current PI window (42 days)."
|
|
404
|
+
),
|
|
405
|
+
"details": "Model is current for this Program Increment.",
|
|
406
|
+
}
|
|
407
|
+
elif days_since <= 90:
|
|
408
|
+
return {
|
|
409
|
+
"status": "partially_compliant",
|
|
410
|
+
"evidence": (
|
|
411
|
+
f"Last model import: {last_import.strftime('%Y-%m-%d')} "
|
|
412
|
+
f"({days_since}d ago). Exceeds PI window but within 90 days."
|
|
413
|
+
),
|
|
414
|
+
"details": "Model may be stale; re-import to align with current PI.",
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
return {
|
|
418
|
+
"status": "non_compliant",
|
|
419
|
+
"evidence": (
|
|
420
|
+
f"Last model import: {last_import.strftime('%Y-%m-%d')} "
|
|
421
|
+
f"({days_since}d ago). Exceeds 90-day threshold."
|
|
422
|
+
),
|
|
423
|
+
"details": "Model is stale. Immediate re-import required.",
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
|
|
427
|
+
def _check_data_management(project_id, project_dir, conn):
|
|
428
|
+
"""DES-3.x: Model artifacts stored and versioned.
|
|
429
|
+
|
|
430
|
+
Check source files exist in project_dir and model_snapshots are recorded.
|
|
431
|
+
"""
|
|
432
|
+
# Check for model source files on disk
|
|
433
|
+
source_found = False
|
|
434
|
+
source_files = []
|
|
435
|
+
if project_dir:
|
|
436
|
+
project_path = Path(project_dir)
|
|
437
|
+
model_patterns = ["*.sysml", "*.xmi", "*.reqif", "*.mdzip", "*.mdxml"]
|
|
438
|
+
for pattern in model_patterns:
|
|
439
|
+
matches = list(project_path.rglob(pattern))
|
|
440
|
+
source_files.extend(matches)
|
|
441
|
+
source_found = len(source_files) > 0
|
|
442
|
+
|
|
443
|
+
# Check model_snapshots table
|
|
444
|
+
try:
|
|
445
|
+
snap_row = conn.execute(
|
|
446
|
+
"SELECT COUNT(*) as cnt FROM model_snapshots WHERE project_id = ?",
|
|
447
|
+
(project_id,),
|
|
448
|
+
).fetchone()
|
|
449
|
+
snapshot_count = snap_row["cnt"] if snap_row else 0
|
|
450
|
+
except Exception:
|
|
451
|
+
snapshot_count = 0
|
|
452
|
+
|
|
453
|
+
if source_found and snapshot_count > 0:
|
|
454
|
+
return {
|
|
455
|
+
"status": "compliant",
|
|
456
|
+
"evidence": (
|
|
457
|
+
f"Model source files found ({len(source_files)} file(s)) "
|
|
458
|
+
f"and {snapshot_count} snapshot(s) recorded."
|
|
459
|
+
),
|
|
460
|
+
"details": (
|
|
461
|
+
"Files: "
|
|
462
|
+
+ "; ".join(f.name for f in source_files[:5])
|
|
463
|
+
+ f". Snapshots: {snapshot_count}."
|
|
464
|
+
),
|
|
465
|
+
}
|
|
466
|
+
elif source_found or snapshot_count > 0:
|
|
467
|
+
parts = []
|
|
468
|
+
if source_found:
|
|
469
|
+
parts.append(f"{len(source_files)} source file(s)")
|
|
470
|
+
if snapshot_count > 0:
|
|
471
|
+
parts.append(f"{snapshot_count} snapshot(s)")
|
|
472
|
+
missing = []
|
|
473
|
+
if not source_found:
|
|
474
|
+
missing.append("model source files on disk")
|
|
475
|
+
if snapshot_count == 0:
|
|
476
|
+
missing.append("model snapshots in database")
|
|
477
|
+
return {
|
|
478
|
+
"status": "partially_compliant",
|
|
479
|
+
"evidence": (
|
|
480
|
+
f"Partial data management: found {', '.join(parts)}. "
|
|
481
|
+
f"Missing: {', '.join(missing)}."
|
|
482
|
+
),
|
|
483
|
+
"details": "Both source files and versioned snapshots are required.",
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
return {
|
|
487
|
+
"status": "non_compliant",
|
|
488
|
+
"evidence": "No model source files found and no snapshots recorded.",
|
|
489
|
+
"details": (
|
|
490
|
+
"Expected: .sysml, .xmi, .reqif, .mdzip, or .mdxml files in "
|
|
491
|
+
"project directory AND model_snapshots entries in database."
|
|
492
|
+
),
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
def _check_model_code_sync(project_id, project_dir, conn):
|
|
497
|
+
"""DES-3.x: Model and code in sync.
|
|
498
|
+
|
|
499
|
+
Check model_code_mappings sync_status for the project.
|
|
500
|
+
"""
|
|
501
|
+
try:
|
|
502
|
+
rows = conn.execute(
|
|
503
|
+
"""SELECT sync_status, COUNT(*) as cnt
|
|
504
|
+
FROM model_code_mappings WHERE project_id = ?
|
|
505
|
+
GROUP BY sync_status""",
|
|
506
|
+
(project_id,),
|
|
507
|
+
).fetchall()
|
|
508
|
+
status_counts = {r["sync_status"]: r["cnt"] for r in rows}
|
|
509
|
+
except Exception:
|
|
510
|
+
status_counts = {}
|
|
511
|
+
|
|
512
|
+
total = sum(status_counts.values())
|
|
513
|
+
if total == 0:
|
|
514
|
+
return {
|
|
515
|
+
"status": "non_compliant",
|
|
516
|
+
"evidence": "No model-code mappings found in model_code_mappings table.",
|
|
517
|
+
"details": "Establish model-to-code mappings to enable sync tracking.",
|
|
518
|
+
}
|
|
519
|
+
|
|
520
|
+
synced = status_counts.get("synced", 0) + status_counts.get("in_sync", 0)
|
|
521
|
+
out_of_sync = status_counts.get("out_of_sync", 0) + status_counts.get("stale", 0)
|
|
522
|
+
total - synced - out_of_sync
|
|
523
|
+
|
|
524
|
+
sync_ratio = synced / total if total > 0 else 0.0
|
|
525
|
+
|
|
526
|
+
if sync_ratio >= 0.8:
|
|
527
|
+
return {
|
|
528
|
+
"status": "compliant",
|
|
529
|
+
"evidence": (
|
|
530
|
+
f"Model-code sync: {synced}/{total} mappings synced "
|
|
531
|
+
f"({sync_ratio:.0%}). Out-of-sync: {out_of_sync}."
|
|
532
|
+
),
|
|
533
|
+
"details": (
|
|
534
|
+
"Sync statuses: "
|
|
535
|
+
+ ", ".join(f"{k}={v}" for k, v in sorted(status_counts.items()))
|
|
536
|
+
),
|
|
537
|
+
}
|
|
538
|
+
elif sync_ratio >= 0.5:
|
|
539
|
+
return {
|
|
540
|
+
"status": "partially_compliant",
|
|
541
|
+
"evidence": (
|
|
542
|
+
f"Model-code sync: {synced}/{total} mappings synced "
|
|
543
|
+
f"({sync_ratio:.0%}). Out-of-sync: {out_of_sync}."
|
|
544
|
+
),
|
|
545
|
+
"details": "Between 50-80% sync. Target >= 80% for full compliance.",
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
return {
|
|
549
|
+
"status": "non_compliant",
|
|
550
|
+
"evidence": (
|
|
551
|
+
f"Model-code sync: {synced}/{total} mappings synced "
|
|
552
|
+
f"({sync_ratio:.0%}). Out-of-sync: {out_of_sync}."
|
|
553
|
+
),
|
|
554
|
+
"details": "Below 50% sync. Significant model-code divergence detected.",
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
|
|
558
|
+
def _check_requirements_linked(project_id, project_dir, conn):
|
|
559
|
+
"""DES-4.x: All DOORS requirements linked to model elements.
|
|
560
|
+
|
|
561
|
+
Check digital_thread_links for requirement-type links.
|
|
562
|
+
"""
|
|
563
|
+
try:
|
|
564
|
+
req_row = conn.execute(
|
|
565
|
+
"SELECT COUNT(*) as cnt FROM doors_requirements WHERE project_id = ?",
|
|
566
|
+
(project_id,),
|
|
567
|
+
).fetchone()
|
|
568
|
+
req_count = req_row["cnt"] if req_row else 0
|
|
569
|
+
except Exception:
|
|
570
|
+
req_count = 0
|
|
571
|
+
|
|
572
|
+
if req_count == 0:
|
|
573
|
+
return {
|
|
574
|
+
"status": "non_compliant",
|
|
575
|
+
"evidence": "No DOORS requirements found in doors_requirements table.",
|
|
576
|
+
"details": "Import requirements from DOORS NG to enable traceability.",
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
try:
|
|
580
|
+
linked_row = conn.execute(
|
|
581
|
+
"""SELECT COUNT(DISTINCT source_id) as cnt
|
|
582
|
+
FROM digital_thread_links
|
|
583
|
+
WHERE project_id = ? AND source_type = 'requirement'""",
|
|
584
|
+
(project_id,),
|
|
585
|
+
).fetchone()
|
|
586
|
+
linked_count = linked_row["cnt"] if linked_row else 0
|
|
587
|
+
except Exception:
|
|
588
|
+
linked_count = 0
|
|
589
|
+
|
|
590
|
+
link_ratio = linked_count / req_count if req_count > 0 else 0.0
|
|
591
|
+
|
|
592
|
+
if link_ratio >= 0.8:
|
|
593
|
+
return {
|
|
594
|
+
"status": "compliant",
|
|
595
|
+
"evidence": (
|
|
596
|
+
f"{linked_count}/{req_count} requirements linked to model "
|
|
597
|
+
f"elements ({link_ratio:.0%})."
|
|
598
|
+
),
|
|
599
|
+
"details": "Meets 80% linkage threshold.",
|
|
600
|
+
}
|
|
601
|
+
elif link_ratio > 0:
|
|
602
|
+
return {
|
|
603
|
+
"status": "partially_compliant",
|
|
604
|
+
"evidence": (
|
|
605
|
+
f"{linked_count}/{req_count} requirements linked "
|
|
606
|
+
f"({link_ratio:.0%}). Below 80% threshold."
|
|
607
|
+
),
|
|
608
|
+
"details": "Add traceability links for unlinked requirements.",
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
return {
|
|
612
|
+
"status": "non_compliant",
|
|
613
|
+
"evidence": (
|
|
614
|
+
f"{req_count} requirements found but none linked to model elements."
|
|
615
|
+
),
|
|
616
|
+
"details": "No requirement-to-model links in digital_thread_links.",
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
|
|
620
|
+
def _check_model_based_testing(project_id, project_dir, conn):
|
|
621
|
+
"""DES-4.x: Tests generated from or linked to model.
|
|
622
|
+
|
|
623
|
+
Check code->test thread links in digital_thread_links.
|
|
624
|
+
"""
|
|
625
|
+
try:
|
|
626
|
+
test_row = conn.execute(
|
|
627
|
+
"""SELECT COUNT(*) as cnt
|
|
628
|
+
FROM digital_thread_links
|
|
629
|
+
WHERE project_id = ?
|
|
630
|
+
AND (target_type = 'test' OR source_type = 'test'
|
|
631
|
+
OR link_type = 'verifies' OR link_type = 'verify')""",
|
|
632
|
+
(project_id,),
|
|
633
|
+
).fetchone()
|
|
634
|
+
test_links = test_row["cnt"] if test_row else 0
|
|
635
|
+
except Exception:
|
|
636
|
+
test_links = 0
|
|
637
|
+
|
|
638
|
+
if test_links == 0:
|
|
639
|
+
return {
|
|
640
|
+
"status": "non_compliant",
|
|
641
|
+
"evidence": "No model-to-test traceability links found.",
|
|
642
|
+
"details": (
|
|
643
|
+
"No 'verifies' or test-type links in digital_thread_links. "
|
|
644
|
+
"Link test cases to model requirements and design elements."
|
|
645
|
+
),
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
try:
|
|
649
|
+
total_row = conn.execute(
|
|
650
|
+
"""SELECT COUNT(DISTINCT source_id) as cnt
|
|
651
|
+
FROM digital_thread_links
|
|
652
|
+
WHERE project_id = ? AND source_type = 'requirement'""",
|
|
653
|
+
(project_id,),
|
|
654
|
+
).fetchone()
|
|
655
|
+
total_reqs_linked = total_row["cnt"] if total_row else 0
|
|
656
|
+
except Exception:
|
|
657
|
+
total_reqs_linked = 0
|
|
658
|
+
|
|
659
|
+
if test_links >= 5 or (total_reqs_linked > 0 and test_links >= total_reqs_linked):
|
|
660
|
+
return {
|
|
661
|
+
"status": "compliant",
|
|
662
|
+
"evidence": (
|
|
663
|
+
f"{test_links} model-to-test traceability link(s) found."
|
|
664
|
+
),
|
|
665
|
+
"details": "Model-based testing traceability is established.",
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
return {
|
|
669
|
+
"status": "partially_compliant",
|
|
670
|
+
"evidence": (
|
|
671
|
+
f"{test_links} model-to-test link(s) found. "
|
|
672
|
+
"Additional links recommended for full coverage."
|
|
673
|
+
),
|
|
674
|
+
"details": "Expand verify/test links to cover all requirements.",
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
|
|
678
|
+
def _check_model_compliance_mapping(project_id, project_dir, conn):
|
|
679
|
+
"""DES-5.x: Model elements mapped to NIST controls.
|
|
680
|
+
|
|
681
|
+
Check model->control thread links in digital_thread_links.
|
|
682
|
+
"""
|
|
683
|
+
try:
|
|
684
|
+
ctrl_row = conn.execute(
|
|
685
|
+
"""SELECT COUNT(*) as cnt
|
|
686
|
+
FROM digital_thread_links
|
|
687
|
+
WHERE project_id = ?
|
|
688
|
+
AND (target_type = 'control' OR source_type = 'control'
|
|
689
|
+
OR link_type = 'implements_control'
|
|
690
|
+
OR link_type = 'satisfies_control')""",
|
|
691
|
+
(project_id,),
|
|
692
|
+
).fetchone()
|
|
693
|
+
control_links = ctrl_row["cnt"] if ctrl_row else 0
|
|
694
|
+
except Exception:
|
|
695
|
+
control_links = 0
|
|
696
|
+
|
|
697
|
+
if control_links == 0:
|
|
698
|
+
return {
|
|
699
|
+
"status": "non_compliant",
|
|
700
|
+
"evidence": "No model-to-NIST-control traceability links found.",
|
|
701
|
+
"details": (
|
|
702
|
+
"No control-type links in digital_thread_links. "
|
|
703
|
+
"Map model elements to NIST 800-53 controls for compliance traceability."
|
|
704
|
+
),
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
if control_links >= 5:
|
|
708
|
+
return {
|
|
709
|
+
"status": "compliant",
|
|
710
|
+
"evidence": (
|
|
711
|
+
f"{control_links} model-to-control traceability link(s) found."
|
|
712
|
+
),
|
|
713
|
+
"details": "NIST control mapping is established in the digital thread.",
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
return {
|
|
717
|
+
"status": "partially_compliant",
|
|
718
|
+
"evidence": (
|
|
719
|
+
f"Only {control_links} model-to-control link(s) found. "
|
|
720
|
+
"Additional mappings recommended."
|
|
721
|
+
),
|
|
722
|
+
"details": "Expand control mappings to cover critical NIST families.",
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
def _check_pi_snapshots(project_id, project_dir, conn):
|
|
727
|
+
"""DES-6.x: Model snapshots exist for current PI.
|
|
728
|
+
|
|
729
|
+
Check model_snapshots table for recent entries (within 42 days).
|
|
730
|
+
"""
|
|
731
|
+
try:
|
|
732
|
+
rows = conn.execute(
|
|
733
|
+
"""SELECT snapshot_date FROM model_snapshots
|
|
734
|
+
WHERE project_id = ?
|
|
735
|
+
ORDER BY snapshot_date DESC""",
|
|
736
|
+
(project_id,),
|
|
737
|
+
).fetchall()
|
|
738
|
+
except Exception:
|
|
739
|
+
rows = []
|
|
740
|
+
|
|
741
|
+
if not rows:
|
|
742
|
+
return {
|
|
743
|
+
"status": "non_compliant",
|
|
744
|
+
"evidence": "No model snapshots found in model_snapshots table.",
|
|
745
|
+
"details": "Create PI baseline snapshots to establish version history.",
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
# Check if most recent snapshot is within current PI (42 days)
|
|
749
|
+
try:
|
|
750
|
+
latest_str = rows[0]["snapshot_date"]
|
|
751
|
+
latest = datetime.fromisoformat(
|
|
752
|
+
latest_str.replace("Z", "+00:00").replace("+00:00", "")
|
|
753
|
+
)
|
|
754
|
+
except (ValueError, AttributeError, TypeError):
|
|
755
|
+
return {
|
|
756
|
+
"status": "partially_compliant",
|
|
757
|
+
"evidence": (
|
|
758
|
+
f"{len(rows)} snapshot(s) found but cannot parse latest date."
|
|
759
|
+
),
|
|
760
|
+
"details": "Verify snapshot date format in model_snapshots table.",
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
now = datetime.now(timezone.utc)
|
|
764
|
+
days_since = (now - latest).days
|
|
765
|
+
|
|
766
|
+
if days_since <= 42:
|
|
767
|
+
return {
|
|
768
|
+
"status": "compliant",
|
|
769
|
+
"evidence": (
|
|
770
|
+
f"{len(rows)} snapshot(s) total. Latest: "
|
|
771
|
+
f"{latest.strftime('%Y-%m-%d')} ({days_since}d ago). "
|
|
772
|
+
"Within current PI."
|
|
773
|
+
),
|
|
774
|
+
"details": "PI baseline snapshot is current.",
|
|
775
|
+
}
|
|
776
|
+
elif days_since <= 90:
|
|
777
|
+
return {
|
|
778
|
+
"status": "partially_compliant",
|
|
779
|
+
"evidence": (
|
|
780
|
+
f"{len(rows)} snapshot(s) total. Latest: "
|
|
781
|
+
f"{latest.strftime('%Y-%m-%d')} ({days_since}d ago). "
|
|
782
|
+
"Exceeds PI window."
|
|
783
|
+
),
|
|
784
|
+
"details": "Create a new snapshot for the current PI.",
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
return {
|
|
788
|
+
"status": "non_compliant",
|
|
789
|
+
"evidence": (
|
|
790
|
+
f"{len(rows)} snapshot(s) total. Latest: "
|
|
791
|
+
f"{latest.strftime('%Y-%m-%d')} ({days_since}d ago). "
|
|
792
|
+
"Severely outdated."
|
|
793
|
+
),
|
|
794
|
+
"details": "Snapshots are stale. Create new PI baseline immediately.",
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
# -----------------------------------------------------------------
|
|
799
|
+
# Auto-check dispatch table
|
|
800
|
+
# -----------------------------------------------------------------
|
|
801
|
+
|
|
802
|
+
AUTO_CHECKS = {
|
|
803
|
+
"model_authority": [_check_model_authority, _check_model_completeness],
|
|
804
|
+
"data_management": [_check_data_management, _check_model_code_sync],
|
|
805
|
+
"infrastructure": [], # Manual checks
|
|
806
|
+
"workforce": [], # Manual checks
|
|
807
|
+
"policy": [_check_requirements_linked, _check_model_compliance_mapping],
|
|
808
|
+
"lifecycle": [
|
|
809
|
+
_check_digital_thread,
|
|
810
|
+
_check_model_currency,
|
|
811
|
+
_check_model_based_testing,
|
|
812
|
+
_check_pi_snapshots,
|
|
813
|
+
],
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
# Map individual requirement IDs to specific check functions
|
|
817
|
+
_REQ_CHECK_MAP = {
|
|
818
|
+
"DES-1.1": _check_model_authority,
|
|
819
|
+
"DES-1.2": _check_model_completeness,
|
|
820
|
+
"DES-2.1": _check_digital_thread,
|
|
821
|
+
"DES-2.3": _check_data_management,
|
|
822
|
+
"DES-2.4": _check_model_code_sync,
|
|
823
|
+
"DES-5.3": _check_requirements_linked,
|
|
824
|
+
"DES-5.4": _check_model_compliance_mapping,
|
|
825
|
+
"DES-6.2": _check_model_based_testing,
|
|
826
|
+
"DES-6.4": _check_digital_thread,
|
|
827
|
+
}
|
|
828
|
+
|
|
829
|
+
|
|
830
|
+
# -----------------------------------------------------------------
|
|
831
|
+
# Core assessment function
|
|
832
|
+
# -----------------------------------------------------------------
|
|
833
|
+
|
|
834
|
+
def run_des_assessment(project_id, project_dir, db_path=None):
|
|
835
|
+
"""Run full DES compliance assessment.
|
|
836
|
+
|
|
837
|
+
Steps:
|
|
838
|
+
1. Load DES requirements catalog
|
|
839
|
+
2. Run auto-checks per category
|
|
840
|
+
3. Store results in des_compliance table (INSERT OR REPLACE)
|
|
841
|
+
4. Compute gate status (0 non_compliant on critical = PASS)
|
|
842
|
+
5. Log audit trail (des_assessed)
|
|
843
|
+
|
|
844
|
+
Args:
|
|
845
|
+
project_id: The project identifier.
|
|
846
|
+
project_dir: Project directory path for file-based checks.
|
|
847
|
+
db_path: Override database path.
|
|
848
|
+
|
|
849
|
+
Returns:
|
|
850
|
+
dict with total, compliant, partial, non_compliant, not_applicable,
|
|
851
|
+
not_assessed, gate_status, score, and detailed results.
|
|
852
|
+
"""
|
|
853
|
+
conn = get_connection(db_path=db_path)
|
|
854
|
+
try:
|
|
855
|
+
_ensure_table(conn)
|
|
856
|
+
project = _get_project(conn, project_id)
|
|
857
|
+
|
|
858
|
+
# 1. Load DES requirements catalog
|
|
859
|
+
requirements = load_des_requirements()
|
|
860
|
+
|
|
861
|
+
now = datetime.now(timezone.utc)
|
|
862
|
+
results = []
|
|
863
|
+
|
|
864
|
+
# 2. Assess each requirement
|
|
865
|
+
for req in requirements:
|
|
866
|
+
req_id = req["id"]
|
|
867
|
+
category = req["category"]
|
|
868
|
+
title = req["title"]
|
|
869
|
+
priority = req.get("priority", "medium")
|
|
870
|
+
automation_level = req.get("automation_level", "manual")
|
|
871
|
+
|
|
872
|
+
status = "not_assessed"
|
|
873
|
+
evidence = ""
|
|
874
|
+
automation_result = ""
|
|
875
|
+
notes = ""
|
|
876
|
+
|
|
877
|
+
# Determine if an auto-check exists for this requirement
|
|
878
|
+
check_func = _REQ_CHECK_MAP.get(req_id)
|
|
879
|
+
|
|
880
|
+
# Also check category-level auto-check list
|
|
881
|
+
if not check_func and automation_level in ("auto", "semi_auto"):
|
|
882
|
+
category_checks = AUTO_CHECKS.get(category, [])
|
|
883
|
+
# Use the first available check for this category if not
|
|
884
|
+
# specifically mapped
|
|
885
|
+
if category_checks:
|
|
886
|
+
check_func = category_checks[0]
|
|
887
|
+
|
|
888
|
+
if check_func and automation_level in ("auto", "semi_auto"):
|
|
889
|
+
try:
|
|
890
|
+
check_result = check_func(project_id, project_dir, conn)
|
|
891
|
+
status = check_result["status"]
|
|
892
|
+
evidence = check_result["evidence"]
|
|
893
|
+
automation_result = json.dumps({
|
|
894
|
+
"check_function": check_func.__name__,
|
|
895
|
+
"automation_level": automation_level,
|
|
896
|
+
"details": check_result.get("details", ""),
|
|
897
|
+
})
|
|
898
|
+
if automation_level == "semi_auto":
|
|
899
|
+
notes = (
|
|
900
|
+
"Semi-automated check completed. "
|
|
901
|
+
"Manual review recommended to verify full compliance."
|
|
902
|
+
)
|
|
903
|
+
except Exception as e:
|
|
904
|
+
status = "not_assessed"
|
|
905
|
+
evidence = f"Auto-check error: {e}"
|
|
906
|
+
notes = "Auto-check failed; manual review required."
|
|
907
|
+
automation_result = json.dumps({
|
|
908
|
+
"check_function": check_func.__name__,
|
|
909
|
+
"error": str(e),
|
|
910
|
+
})
|
|
911
|
+
elif automation_level == "manual":
|
|
912
|
+
status = "not_assessed"
|
|
913
|
+
evidence = "Manual assessment required."
|
|
914
|
+
notes = (
|
|
915
|
+
"This requirement must be verified manually. "
|
|
916
|
+
"Assessment criteria: "
|
|
917
|
+
+ "; ".join(req.get("assessment_criteria", ["See requirement description."]))
|
|
918
|
+
)
|
|
919
|
+
else:
|
|
920
|
+
# Auto or semi_auto but no check function mapped
|
|
921
|
+
status = "not_assessed"
|
|
922
|
+
evidence = "No automated check implemented for this requirement."
|
|
923
|
+
notes = "Manual review required."
|
|
924
|
+
|
|
925
|
+
result_entry = {
|
|
926
|
+
"requirement_id": req_id,
|
|
927
|
+
"requirement_title": title,
|
|
928
|
+
"category": category,
|
|
929
|
+
"priority": priority,
|
|
930
|
+
"automation_level": automation_level,
|
|
931
|
+
"nist_controls": req.get("nist_controls", []),
|
|
932
|
+
"des_goal": req.get("des_goal"),
|
|
933
|
+
"status": status,
|
|
934
|
+
"evidence": evidence,
|
|
935
|
+
"automation_result": automation_result,
|
|
936
|
+
"notes": notes,
|
|
937
|
+
}
|
|
938
|
+
results.append(result_entry)
|
|
939
|
+
|
|
940
|
+
# 3. Store in des_compliance table (INSERT OR REPLACE)
|
|
941
|
+
try:
|
|
942
|
+
conn.execute(
|
|
943
|
+
"""INSERT OR REPLACE INTO des_compliance
|
|
944
|
+
(project_id, requirement_id, requirement_title,
|
|
945
|
+
category, status, evidence, automation_result,
|
|
946
|
+
assessed_at, notes)
|
|
947
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)""",
|
|
948
|
+
(
|
|
949
|
+
project_id,
|
|
950
|
+
req_id,
|
|
951
|
+
title,
|
|
952
|
+
category,
|
|
953
|
+
status,
|
|
954
|
+
evidence,
|
|
955
|
+
automation_result,
|
|
956
|
+
now.isoformat(),
|
|
957
|
+
notes if notes else None,
|
|
958
|
+
),
|
|
959
|
+
)
|
|
960
|
+
except Exception as e:
|
|
961
|
+
print(
|
|
962
|
+
f"Warning: Could not upsert DES assessment for {req_id}: {e}",
|
|
963
|
+
file=sys.stderr,
|
|
964
|
+
)
|
|
965
|
+
|
|
966
|
+
conn.commit()
|
|
967
|
+
|
|
968
|
+
# 4. Compute summary counts
|
|
969
|
+
total = len(results)
|
|
970
|
+
compliant = sum(1 for r in results if r["status"] == "compliant")
|
|
971
|
+
partial = sum(1 for r in results if r["status"] == "partially_compliant")
|
|
972
|
+
non_compliant = sum(1 for r in results if r["status"] == "non_compliant")
|
|
973
|
+
not_applicable = sum(1 for r in results if r["status"] == "not_applicable")
|
|
974
|
+
not_assessed = sum(1 for r in results if r["status"] == "not_assessed")
|
|
975
|
+
|
|
976
|
+
# Score: 100 * (compliant + partial * 0.5) / (total - not_applicable)
|
|
977
|
+
scoreable = total - not_applicable
|
|
978
|
+
if scoreable > 0:
|
|
979
|
+
score = round(
|
|
980
|
+
100.0 * (compliant + partial * 0.5) / scoreable, 1
|
|
981
|
+
)
|
|
982
|
+
else:
|
|
983
|
+
score = 100.0
|
|
984
|
+
|
|
985
|
+
# Gate logic: PASS if 0 non_compliant on critical priority requirements
|
|
986
|
+
# WARN if any partially_compliant on critical. FAIL otherwise.
|
|
987
|
+
critical_non_compliant = sum(
|
|
988
|
+
1 for r in results
|
|
989
|
+
if r["priority"] == "critical" and r["status"] == "non_compliant"
|
|
990
|
+
)
|
|
991
|
+
critical_partial = sum(
|
|
992
|
+
1 for r in results
|
|
993
|
+
if r["priority"] == "critical" and r["status"] == "partially_compliant"
|
|
994
|
+
)
|
|
995
|
+
|
|
996
|
+
if critical_non_compliant == 0 and critical_partial == 0:
|
|
997
|
+
gate_status = "PASS"
|
|
998
|
+
elif critical_non_compliant == 0 and critical_partial > 0:
|
|
999
|
+
gate_status = "WARN"
|
|
1000
|
+
else:
|
|
1001
|
+
gate_status = "FAIL"
|
|
1002
|
+
|
|
1003
|
+
# Build category summary
|
|
1004
|
+
category_summary = {}
|
|
1005
|
+
for cat in ["model_authority", "data_management", "infrastructure",
|
|
1006
|
+
"workforce", "policy", "lifecycle"]:
|
|
1007
|
+
cat_results = [r for r in results if r["category"] == cat]
|
|
1008
|
+
cat_total = len(cat_results)
|
|
1009
|
+
cat_na = sum(1 for r in cat_results if r["status"] == "not_applicable")
|
|
1010
|
+
cat_scoreable = cat_total - cat_na
|
|
1011
|
+
cat_compliant = sum(1 for r in cat_results if r["status"] == "compliant")
|
|
1012
|
+
cat_partial = sum(1 for r in cat_results if r["status"] == "partially_compliant")
|
|
1013
|
+
cat_score = (
|
|
1014
|
+
round(100.0 * (cat_compliant + cat_partial * 0.5) / cat_scoreable, 1)
|
|
1015
|
+
if cat_scoreable > 0 else 100.0
|
|
1016
|
+
)
|
|
1017
|
+
category_summary[cat] = {
|
|
1018
|
+
"total": cat_total,
|
|
1019
|
+
"compliant": cat_compliant,
|
|
1020
|
+
"partially_compliant": cat_partial,
|
|
1021
|
+
"non_compliant": sum(1 for r in cat_results if r["status"] == "non_compliant"),
|
|
1022
|
+
"not_applicable": cat_na,
|
|
1023
|
+
"not_assessed": sum(1 for r in cat_results if r["status"] == "not_assessed"),
|
|
1024
|
+
"score": cat_score,
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
# 5. Log audit trail
|
|
1028
|
+
audit_details = {
|
|
1029
|
+
"total": total,
|
|
1030
|
+
"compliant": compliant,
|
|
1031
|
+
"partially_compliant": partial,
|
|
1032
|
+
"non_compliant": non_compliant,
|
|
1033
|
+
"not_applicable": not_applicable,
|
|
1034
|
+
"not_assessed": not_assessed,
|
|
1035
|
+
"score": score,
|
|
1036
|
+
"gate_status": gate_status,
|
|
1037
|
+
"critical_non_compliant": critical_non_compliant,
|
|
1038
|
+
"critical_partial": critical_partial,
|
|
1039
|
+
"category_summary": category_summary,
|
|
1040
|
+
}
|
|
1041
|
+
_log_audit_event(
|
|
1042
|
+
conn,
|
|
1043
|
+
project_id,
|
|
1044
|
+
f"DES assessment completed (score={score}%, gate={gate_status})",
|
|
1045
|
+
audit_details,
|
|
1046
|
+
)
|
|
1047
|
+
|
|
1048
|
+
# Console output
|
|
1049
|
+
print("DES assessment completed:")
|
|
1050
|
+
print(f" Project: {project.get('name', project_id)}")
|
|
1051
|
+
print(f" Requirements: {total}")
|
|
1052
|
+
print(f" Compliant: {compliant}")
|
|
1053
|
+
print(f" Partial: {partial}")
|
|
1054
|
+
print(f" Non-Compliant: {non_compliant}")
|
|
1055
|
+
print(f" Not Assessed: {not_assessed}")
|
|
1056
|
+
print(f" Not Applicable: {not_applicable}")
|
|
1057
|
+
print(f" Score: {score}%")
|
|
1058
|
+
print(f" Gate Status: {gate_status}")
|
|
1059
|
+
print()
|
|
1060
|
+
for cat, cs in category_summary.items():
|
|
1061
|
+
print(
|
|
1062
|
+
f" {cat}: "
|
|
1063
|
+
f"C={cs['compliant']} "
|
|
1064
|
+
f"P={cs['partially_compliant']} "
|
|
1065
|
+
f"NC={cs['non_compliant']} "
|
|
1066
|
+
f"NA={cs['not_assessed']} "
|
|
1067
|
+
f"Score={cs['score']}%"
|
|
1068
|
+
)
|
|
1069
|
+
|
|
1070
|
+
return {
|
|
1071
|
+
"total": total,
|
|
1072
|
+
"compliant": compliant,
|
|
1073
|
+
"partial": partial,
|
|
1074
|
+
"non_compliant": non_compliant,
|
|
1075
|
+
"not_applicable": not_applicable,
|
|
1076
|
+
"not_assessed": not_assessed,
|
|
1077
|
+
"gate_status": gate_status,
|
|
1078
|
+
"score": score,
|
|
1079
|
+
"category_summary": category_summary,
|
|
1080
|
+
"results": results,
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
finally:
|
|
1084
|
+
conn.close()
|
|
1085
|
+
|
|
1086
|
+
|
|
1087
|
+
# -----------------------------------------------------------------
|
|
1088
|
+
# CLI entrypoint
|
|
1089
|
+
# -----------------------------------------------------------------
|
|
1090
|
+
|
|
1091
|
+
if __name__ == "__main__":
|
|
1092
|
+
parser = argparse.ArgumentParser(
|
|
1093
|
+
description="DoDI 5000.87 Digital Engineering Strategy Assessment"
|
|
1094
|
+
)
|
|
1095
|
+
parser.add_argument(
|
|
1096
|
+
"--project-id", required=True, help="Project ID"
|
|
1097
|
+
)
|
|
1098
|
+
parser.add_argument(
|
|
1099
|
+
"--project-dir", required=True,
|
|
1100
|
+
help="Project directory for file-based checks"
|
|
1101
|
+
)
|
|
1102
|
+
parser.add_argument(
|
|
1103
|
+
"--json", action="store_true",
|
|
1104
|
+
help="Output results as JSON"
|
|
1105
|
+
)
|
|
1106
|
+
parser.add_argument(
|
|
1107
|
+
"--report", action="store_true",
|
|
1108
|
+
help="Also generate DES compliance report"
|
|
1109
|
+
)
|
|
1110
|
+
parser.add_argument(
|
|
1111
|
+
"--output", help="Report output path"
|
|
1112
|
+
)
|
|
1113
|
+
parser.add_argument(
|
|
1114
|
+
"--db-path", type=Path, default=DB_PATH,
|
|
1115
|
+
help="Override database path"
|
|
1116
|
+
)
|
|
1117
|
+
args = parser.parse_args()
|
|
1118
|
+
|
|
1119
|
+
try:
|
|
1120
|
+
result = run_des_assessment(
|
|
1121
|
+
project_id=args.project_id,
|
|
1122
|
+
project_dir=args.project_dir,
|
|
1123
|
+
db_path=args.db_path,
|
|
1124
|
+
)
|
|
1125
|
+
|
|
1126
|
+
if args.json:
|
|
1127
|
+
# Exclude full results list for concise JSON output
|
|
1128
|
+
output = {
|
|
1129
|
+
"total": result["total"],
|
|
1130
|
+
"compliant": result["compliant"],
|
|
1131
|
+
"partial": result["partial"],
|
|
1132
|
+
"non_compliant": result["non_compliant"],
|
|
1133
|
+
"not_applicable": result["not_applicable"],
|
|
1134
|
+
"not_assessed": result["not_assessed"],
|
|
1135
|
+
"gate_status": result["gate_status"],
|
|
1136
|
+
"score": result["score"],
|
|
1137
|
+
"category_summary": result["category_summary"],
|
|
1138
|
+
}
|
|
1139
|
+
print(json.dumps(output, indent=2))
|
|
1140
|
+
|
|
1141
|
+
if args.report:
|
|
1142
|
+
try:
|
|
1143
|
+
from des_report_generator import generate_des_report
|
|
1144
|
+
report_result = generate_des_report(
|
|
1145
|
+
project_id=args.project_id,
|
|
1146
|
+
output_path=args.output,
|
|
1147
|
+
db_path=args.db_path,
|
|
1148
|
+
)
|
|
1149
|
+
print(f"\n Report: {report_result.get('file_path', 'N/A')}")
|
|
1150
|
+
except ImportError:
|
|
1151
|
+
# Try absolute import
|
|
1152
|
+
try:
|
|
1153
|
+
sys.path.insert(0, str(Path(__file__).resolve().parent))
|
|
1154
|
+
from des_report_generator import generate_des_report
|
|
1155
|
+
report_result = generate_des_report(
|
|
1156
|
+
project_id=args.project_id,
|
|
1157
|
+
output_path=args.output,
|
|
1158
|
+
db_path=args.db_path,
|
|
1159
|
+
)
|
|
1160
|
+
print(f"\n Report: {report_result.get('file_path', 'N/A')}")
|
|
1161
|
+
except ImportError as ie:
|
|
1162
|
+
print(
|
|
1163
|
+
f"Warning: Could not import des_report_generator: {ie}",
|
|
1164
|
+
file=sys.stderr,
|
|
1165
|
+
)
|
|
1166
|
+
|
|
1167
|
+
if result["gate_status"] == "FAIL":
|
|
1168
|
+
sys.exit(1)
|
|
1169
|
+
|
|
1170
|
+
except (FileNotFoundError, ValueError) as e:
|
|
1171
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
1172
|
+
sys.exit(1)
|
|
1173
|
+
# [TEMPLATE: CUI // SP-CTI]
|