icdev 1.0.0__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.
- icdev/__init__.py +18 -0
- icdev/_paths.py +85 -0
- icdev/_version.py +3 -0
- icdev/data/__init__.py +1 -0
- icdev/data/args/__init__.py +1 -0
- icdev/data/args/agent_authority.yaml +61 -0
- icdev/data/args/agent_config.yaml +355 -0
- icdev/data/args/agentic_fitness.yaml +31 -0
- icdev/data/args/ai_governance_config.yaml +137 -0
- icdev/data/args/atlas_critique_config.yaml +66 -0
- icdev/data/args/bedrock_models.yaml +63 -0
- icdev/data/args/cicd_config.yaml +82 -0
- icdev/data/args/classification_config.yaml +232 -0
- icdev/data/args/cli_config.yaml +154 -0
- icdev/data/args/cloud_config.yaml +63 -0
- icdev/data/args/code_pattern_config.yaml +151 -0
- icdev/data/args/code_quality_config.yaml +47 -0
- icdev/data/args/companion_registry.yaml +202 -0
- icdev/data/args/context_config.yaml +82 -0
- icdev/data/args/csp_monitor_config.yaml +268 -0
- icdev/data/args/cui_markings.yaml +35 -0
- icdev/data/args/db_config.yaml +40 -0
- icdev/data/args/deployment_profiles.yaml +248 -0
- icdev/data/args/dev_profile_config.yaml +144 -0
- icdev/data/args/devsecops_config.yaml +286 -0
- icdev/data/args/endpoint_security_config.yaml +137 -0
- icdev/data/args/extension_config.yaml +79 -0
- icdev/data/args/file_access_tiers.yaml +88 -0
- icdev/data/args/framework_registry.yaml +415 -0
- icdev/data/args/innovation_config.yaml +431 -0
- icdev/data/args/installation_manifest.yaml +1087 -0
- icdev/data/args/llm_config.yaml +495 -0
- icdev/data/args/maintenance_config.yaml +55 -0
- icdev/data/args/memory_config.yaml +83 -0
- icdev/data/args/monitoring_config.yaml +127 -0
- icdev/data/args/mosa_config.yaml +190 -0
- icdev/data/args/nlq_config.yaml +35 -0
- icdev/data/args/observability_config.yaml +39 -0
- icdev/data/args/observability_tracing_config.yaml +170 -0
- icdev/data/args/oscal_tools_config.yaml +43 -0
- icdev/data/args/owasp_agentic_config.yaml +171 -0
- icdev/data/args/phase_registry.yaml +618 -0
- icdev/data/args/project_defaults.yaml +235 -0
- icdev/data/args/prompt_chains.yaml +163 -0
- icdev/data/args/resilience_config.yaml +50 -0
- icdev/data/args/ricoas_config.yaml +191 -0
- icdev/data/args/role_personas.yaml +362 -0
- icdev/data/args/scaling_config.yaml +176 -0
- icdev/data/args/security_gates.yaml +685 -0
- icdev/data/args/skill_injection_config.yaml +322 -0
- icdev/data/args/spec_config.yaml +53 -0
- icdev/data/args/supply_chain_config.yaml +76 -0
- icdev/data/args/translation_config.yaml +228 -0
- icdev/data/args/workflow_templates/ato_acceleration.yaml +54 -0
- icdev/data/args/workflow_templates/build_deploy.yaml +63 -0
- icdev/data/args/workflow_templates/full_compliance.yaml +43 -0
- icdev/data/args/workflow_templates/security_hardening.yaml +55 -0
- icdev/data/args/worktree_config.yaml +34 -0
- icdev/data/args/zta_config.yaml +247 -0
- icdev/data/context/__init__.py +1 -0
- icdev/data/context/agent/__init__.py +1 -0
- icdev/data/context/agent/response_schemas/__init__.py +1 -0
- icdev/data/context/agent/response_schemas/debate_position.json +46 -0
- icdev/data/context/agent/response_schemas/fitness_scorecard.json +74 -0
- icdev/data/context/agent/response_schemas/review_decision.json +39 -0
- icdev/data/context/agent/response_schemas/task_decomposition.json +82 -0
- icdev/data/context/agent/response_schemas/veto_decision.json +40 -0
- icdev/data/context/agentic/__init__.py +1 -0
- icdev/data/context/agentic/architecture_patterns.md +269 -0
- icdev/data/context/agentic/capability_registry.yaml +202 -0
- icdev/data/context/agentic/csp_mcp_registry.yaml +280 -0
- icdev/data/context/agentic/fitness_rubric.md +56 -0
- icdev/data/context/agentic/governance_baseline.md +205 -0
- icdev/data/context/ci/__init__.py +1 -0
- icdev/data/context/ci/worktree_templates.json +44 -0
- icdev/data/context/cloud/__init__.py +1 -0
- icdev/data/context/cloud/csp_service_registry.json +739 -0
- icdev/data/context/compliance/__init__.py +1 -0
- icdev/data/context/compliance/atlas_mitigations.json +293 -0
- icdev/data/context/compliance/atlas_techniques.json +833 -0
- icdev/data/context/compliance/cisa_sbd_requirements.json +432 -0
- icdev/data/context/compliance/cjis_security_policy.json +522 -0
- icdev/data/context/compliance/cmmc_practices.json +2494 -0
- icdev/data/context/compliance/cmmc_report_template.md +142 -0
- icdev/data/context/compliance/cnssi_1253_overlay.json +109 -0
- icdev/data/context/compliance/control_crosswalk.json +1914 -0
- icdev/data/context/compliance/control_families/__init__.py +1 -0
- icdev/data/context/compliance/csp_certifications.json +251 -0
- icdev/data/context/compliance/cssp_report_template.md +193 -0
- icdev/data/context/compliance/cui_templates/__init__.py +1 -0
- icdev/data/context/compliance/cui_templates/banner_block.txt +4 -0
- icdev/data/context/compliance/cui_templates/code_header.txt +8 -0
- icdev/data/context/compliance/cui_templates/document_template.md +35 -0
- icdev/data/context/compliance/data_type_framework_map.json +321 -0
- icdev/data/context/compliance/data_type_registry.json +147 -0
- icdev/data/context/compliance/dod_cssp_8530.json +463 -0
- icdev/data/context/compliance/eu_ai_act_annex_iii.json +108 -0
- icdev/data/context/compliance/export_templates/__init__.py +1 -0
- icdev/data/context/compliance/export_templates/emass_controls.csv.j2 +4 -0
- icdev/data/context/compliance/export_templates/evidence_package.md.j2 +39 -0
- icdev/data/context/compliance/export_templates/executive_summary.md.j2 +55 -0
- icdev/data/context/compliance/export_templates/poam_tracking.csv.j2 +4 -0
- icdev/data/context/compliance/fedramp_20x_ksi_schemas.json +133 -0
- icdev/data/context/compliance/fedramp_high_baseline.json +4370 -0
- icdev/data/context/compliance/fedramp_moderate_baseline.json +2183 -0
- icdev/data/context/compliance/fedramp_report_template.md +181 -0
- icdev/data/context/compliance/fips_200_areas.json +362 -0
- icdev/data/context/compliance/gao_ai_accountability.json +262 -0
- icdev/data/context/compliance/hipaa_security_rule.json +720 -0
- icdev/data/context/compliance/hitrust_csf_v11.json +930 -0
- icdev/data/context/compliance/impact_level_profiles.json +251 -0
- icdev/data/context/compliance/incident_response_template.md +1110 -0
- icdev/data/context/compliance/iso27001_2022_controls.json +750 -0
- icdev/data/context/compliance/iso27001_nist_bridge.json +382 -0
- icdev/data/context/compliance/iso42001_controls.json +254 -0
- icdev/data/context/compliance/ivv_checklist_template.md +80 -0
- icdev/data/context/compliance/ivv_report_template.md +116 -0
- icdev/data/context/compliance/ivv_requirements.json +372 -0
- icdev/data/context/compliance/mosa_crosswalk.json +327 -0
- icdev/data/context/compliance/mosa_framework.json +250 -0
- icdev/data/context/compliance/narrative_templates/AC.md.j2 +101 -0
- icdev/data/context/compliance/narrative_templates/AU.md.j2 +106 -0
- icdev/data/context/compliance/narrative_templates/IA.md.j2 +104 -0
- icdev/data/context/compliance/narrative_templates/SC.md.j2 +102 -0
- icdev/data/context/compliance/narrative_templates/SI.md.j2 +111 -0
- icdev/data/context/compliance/narrative_templates/__init__.py +1 -0
- icdev/data/context/compliance/narrative_templates/default.md.j2 +50 -0
- icdev/data/context/compliance/narrative_templates/executive_summary.j2 +27 -0
- icdev/data/context/compliance/narrative_templates/poam_milestone.j2 +19 -0
- icdev/data/context/compliance/narrative_templates/ssp_section.j2 +11 -0
- icdev/data/context/compliance/nist_800_171_controls.json +1552 -0
- icdev/data/context/compliance/nist_800_207_crosswalk.json +399 -0
- icdev/data/context/compliance/nist_800_207_zta.json +258 -0
- icdev/data/context/compliance/nist_800_53.json +324 -0
- icdev/data/context/compliance/nist_ai_600_1_genai.json +326 -0
- icdev/data/context/compliance/nist_ai_rmf.json +206 -0
- icdev/data/context/compliance/nist_sp_800_60_types.json +1667 -0
- icdev/data/context/compliance/omb_m25_21_high_impact_ai.json +248 -0
- icdev/data/context/compliance/omb_m26_04_unbiased_ai.json +262 -0
- icdev/data/context/compliance/owasp_agentic_asi.json +133 -0
- icdev/data/context/compliance/owasp_agentic_threats.json +285 -0
- icdev/data/context/compliance/owasp_llm_top10.json +274 -0
- icdev/data/context/compliance/pci_dss_v4.json +510 -0
- icdev/data/context/compliance/poam_template.md +117 -0
- icdev/data/context/compliance/safeai_controls.json +512 -0
- icdev/data/context/compliance/sbd_report_template.md +77 -0
- icdev/data/context/compliance/siem_config_templates/__init__.py +1 -0
- icdev/data/context/compliance/siem_config_templates/filebeat.yml +213 -0
- icdev/data/context/compliance/siem_config_templates/log_sources.json +208 -0
- icdev/data/context/compliance/soc2_trust_criteria.json +661 -0
- icdev/data/context/compliance/ssp_template.md +432 -0
- icdev/data/context/compliance/stig_templates/__init__.py +1 -0
- icdev/data/context/compliance/stig_templates/webapp_stig.json +139 -0
- icdev/data/context/compliance/xai_requirements.json +108 -0
- icdev/data/context/dashboard/__init__.py +1 -0
- icdev/data/context/dashboard/nlq_examples.json +50 -0
- icdev/data/context/dashboard/schema_descriptions.json +23 -0
- icdev/data/context/integration/__init__.py +1 -0
- icdev/data/context/integration/approval_workflows.json +32 -0
- icdev/data/context/integration/gitlab_field_mappings.json +33 -0
- icdev/data/context/integration/jira_field_mappings.json +32 -0
- icdev/data/context/integration/reqif_export_schema.json +23 -0
- icdev/data/context/integration/servicenow_field_mappings.json +22 -0
- icdev/data/context/languages/__init__.py +1 -0
- icdev/data/context/languages/framework_patterns.json +205 -0
- icdev/data/context/languages/language_registry.json +279 -0
- icdev/data/context/llm/__init__.py +1 -0
- icdev/data/context/llm/example_provider.py +86 -0
- icdev/data/context/mbse/__init__.py +1 -0
- icdev/data/context/mbse/des_report_template.md +162 -0
- icdev/data/context/mbse/des_requirements.json +411 -0
- icdev/data/context/mbse/digital_thread_patterns.json +403 -0
- icdev/data/context/mbse/reqif_schema.json +280 -0
- icdev/data/context/mbse/sysml_element_types.json +432 -0
- icdev/data/context/modernization/__init__.py +1 -0
- icdev/data/context/modernization/db_type_mappings.json +148 -0
- icdev/data/context/modernization/decomposition_patterns.json +284 -0
- icdev/data/context/modernization/framework_migration_patterns.json +359 -0
- icdev/data/context/modernization/migration_report_template.md +168 -0
- icdev/data/context/modernization/seven_rs_catalog.json +369 -0
- icdev/data/context/modernization/version_upgrade_rules.json +279 -0
- icdev/data/context/oscal/NIST_SP-800-53_rev5_catalog.json +254987 -0
- icdev/data/context/oscal/README.md +43 -0
- icdev/data/context/patterns/__init__.py +1 -0
- icdev/data/context/profiles/__init__.py +1 -0
- icdev/data/context/profiles/dod_baseline_v1.yaml +145 -0
- icdev/data/context/profiles/fedramp_baseline_v1.yaml +143 -0
- icdev/data/context/profiles/financial_baseline_v1.yaml +142 -0
- icdev/data/context/profiles/healthcare_baseline_v1.yaml +135 -0
- icdev/data/context/profiles/law_enforcement_v1.yaml +129 -0
- icdev/data/context/profiles/startup_v1.yaml +134 -0
- icdev/data/context/requirements/__init__.py +1 -0
- icdev/data/context/requirements/ambiguity_patterns.json +97 -0
- icdev/data/context/requirements/boundary_impact_rules.json +123 -0
- icdev/data/context/requirements/default_constitutions.json +67 -0
- icdev/data/context/requirements/document_extraction_rules.json +58 -0
- icdev/data/context/requirements/gap_patterns.json +108 -0
- icdev/data/context/requirements/readiness_rubric.json +78 -0
- icdev/data/context/requirements/red_alternative_patterns.json +210 -0
- icdev/data/context/requirements/safe_templates.json +72 -0
- icdev/data/context/requirements/spec_quality_checklist.json +122 -0
- icdev/data/context/simulation/__init__.py +1 -0
- icdev/data/context/simulation/architecture_patterns.json +36 -0
- icdev/data/context/simulation/coa_templates.json +38 -0
- icdev/data/context/simulation/cost_models.json +23 -0
- icdev/data/context/simulation/risk_categories.json +46 -0
- icdev/data/context/supply_chain/__init__.py +1 -0
- icdev/data/context/supply_chain/isa_templates.json +129 -0
- icdev/data/context/supply_chain/nist_800_161_controls.json +247 -0
- icdev/data/context/supply_chain/scrm_risk_matrix.json +147 -0
- icdev/data/context/templates/__init__.py +1 -0
- icdev/data/context/templates/ansible/__init__.py +1 -0
- icdev/data/context/templates/ansible/playbooks/__init__.py +1 -0
- icdev/data/context/templates/ansible/roles/__init__.py +1 -0
- icdev/data/context/templates/gitlab_ci/__init__.py +1 -0
- icdev/data/context/templates/grafana/__init__.py +1 -0
- icdev/data/context/templates/kubernetes/__init__.py +1 -0
- icdev/data/context/templates/project/__init__.py +1 -0
- icdev/data/context/templates/project/api/__init__.py +1 -0
- icdev/data/context/templates/project/cli/__init__.py +1 -0
- icdev/data/context/templates/project/data_pipeline/__init__.py +1 -0
- icdev/data/context/templates/project/iac/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/src/__init__.py +1 -0
- icdev/data/context/templates/project/javascript_frontend/tests/__init__.py +1 -0
- icdev/data/context/templates/project/microservice/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/src/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/features/__init__.py +1 -0
- icdev/data/context/templates/project/python_backend/tests/steps/__init__.py +1 -0
- icdev/data/context/templates/terraform/__init__.py +1 -0
- icdev/data/context/templates/terraform/govcloud_base/__init__.py +1 -0
- icdev/data/context/templates/terraform/modules/__init__.py +1 -0
- icdev/data/context/tone/__init__.py +1 -0
- icdev/data/context/translation/dependency_mappings.json +186 -0
- icdev/data/context/translation/type_mappings.json +149 -0
- icdev/data/docs/README.md +187 -0
- icdev/data/docs/__init__.py +1 -0
- icdev/data/docs/admin/gateway-guide.md +338 -0
- icdev/data/docs/admin/marketplace-guide.md +396 -0
- icdev/data/docs/admin/monitoring-guide.md +509 -0
- icdev/data/docs/architecture/compliance-framework.md +764 -0
- icdev/data/docs/architecture/database-schema.md +689 -0
- icdev/data/docs/architecture/gotcha-framework.md +518 -0
- icdev/data/docs/architecture/multi-agent-system.md +603 -0
- icdev/data/docs/dx/README.md +106 -0
- icdev/data/docs/dx/__init__.py +1 -0
- icdev/data/docs/dx/ci-cd-integration.md +378 -0
- icdev/data/docs/dx/claude-code-guide.md +213 -0
- icdev/data/docs/dx/companion-guide.md +232 -0
- icdev/data/docs/dx/dev-profiles.md +309 -0
- icdev/data/docs/dx/icdev-yaml-spec.md +219 -0
- icdev/data/docs/dx/integration-tiers.md +279 -0
- icdev/data/docs/dx/llm-routing-guide.md +456 -0
- icdev/data/docs/dx/quickstart.md +192 -0
- icdev/data/docs/dx/sdk-reference.md +356 -0
- icdev/data/docs/dx/unified-mcp-setup.md +525 -0
- icdev/data/docs/features/__init__.py +1 -0
- icdev/data/docs/features/phase-01-gotcha-framework.md +249 -0
- icdev/data/docs/features/phase-02-atlas-build-workflow.md +223 -0
- icdev/data/docs/features/phase-03-tdd-bdd-testing.md +261 -0
- icdev/data/docs/features/phase-04-nist-compliance.md +255 -0
- icdev/data/docs/features/phase-05-security-scanning.md +229 -0
- icdev/data/docs/features/phase-06-infrastructure-deployment.md +288 -0
- icdev/data/docs/features/phase-07-code-review-gates.md +276 -0
- icdev/data/docs/features/phase-08-self-healing.md +223 -0
- icdev/data/docs/features/phase-09-monitoring-observability.md +230 -0
- icdev/data/docs/features/phase-10-dashboard-web-ui.md +218 -0
- icdev/data/docs/features/phase-11-multi-agent-architecture.md +272 -0
- icdev/data/docs/features/phase-12-integration-testing.md +228 -0
- icdev/data/docs/features/phase-13-cicd-integration.md +257 -0
- icdev/data/docs/features/phase-14-secure-by-design-ivv.md +240 -0
- icdev/data/docs/features/phase-15-maintenance-audit.md +192 -0
- icdev/data/docs/features/phase-16-ato-acceleration.md +228 -0
- icdev/data/docs/features/phase-17-multi-framework-compliance.md +223 -0
- icdev/data/docs/features/phase-18-mbse-integration.md +242 -0
- icdev/data/docs/features/phase-19-agentic-generation.md +202 -0
- icdev/data/docs/features/phase-20-fips-security-categorization.md +198 -0
- icdev/data/docs/features/phase-21-saas-multi-tenancy.md +273 -0
- icdev/data/docs/features/phase-22-federated-gotcha-marketplace.md +242 -0
- icdev/data/docs/features/phase-23-universal-compliance-platform.md +238 -0
- icdev/data/docs/features/phase-24-devsecops-pipeline-security.md +198 -0
- icdev/data/docs/features/phase-25-zero-trust-architecture.md +220 -0
- icdev/data/docs/features/phase-26-dod-mosa.md +205 -0
- icdev/data/docs/features/phase-27-cli-capabilities.md +222 -0
- icdev/data/docs/features/phase-28-remote-command-gateway.md +235 -0
- icdev/data/docs/features/phase-29-proactive-monitoring.md +212 -0
- icdev/data/docs/features/phase-30-dashboard-auth.md +215 -0
- icdev/data/docs/features/phase-31-dashboard-ux-low-impact.md +188 -0
- icdev/data/docs/features/phase-32-dashboard-ux-medium-impact.md +223 -0
- icdev/data/docs/features/phase-33-modular-installation.md +218 -0
- icdev/data/docs/features/phase-34-dev-profiles.md +239 -0
- icdev/data/docs/features/phase-35-innovation-engine.md +257 -0
- icdev/data/docs/features/phase-36-evolutionary-intelligence.md +351 -0
- icdev/data/docs/features/phase-37-mitre-atlas-integration.md +485 -0
- icdev/data/docs/features/phase-38-cloud-agnostic-architecture.md +1033 -0
- icdev/data/docs/features/phase-39-observability-operations.md +178 -0
- icdev/data/docs/features/phase-40-nlq-compliance-queries.md +176 -0
- icdev/data/docs/features/phase-41-parallel-cicd.md +169 -0
- icdev/data/docs/features/phase-42-framework-planning.md +177 -0
- icdev/data/docs/features/phase-43-cross-language-translation.md +225 -0
- icdev/data/docs/features/phase-44-innovation-adaptation.md +227 -0
- icdev/data/docs/features/phase-45-owasp-agentic-security.md +239 -0
- icdev/data/docs/features/phase-46-observability-traceability-xai.md +240 -0
- icdev/data/docs/features/phase-47-unified-mcp-gateway.md +257 -0
- icdev/data/docs/features/phase-48-ai-transparency.md +203 -0
- icdev/data/docs/features/phase-49-ai-accountability.md +243 -0
- icdev/data/docs/features/phase-50-ai-governance-intake-chat.md +195 -0
- icdev/data/docs/features/phase-51-unified-chat-dashboard.md +240 -0
- icdev/data/docs/features/phase-52-code-intelligence.md +244 -0
- icdev/data/docs/features/phase-53-fedramp-20x-owasp-asi.md +359 -0
- icdev/data/docs/features/phase-54-slsa-swft-orchestration.md +379 -0
- icdev/data/docs/features/phase-55-a2a-v03-mcp-oauth.md +322 -0
- icdev/data/docs/features/phase-56-evidence-lineage.md +352 -0
- icdev/data/docs/features/phase-57-eu-ai-act-iron-bank.md +319 -0
- icdev/data/docs/features/phase-58-creative-engine.md +370 -0
- icdev/data/docs/features/phase-59-govcon-intelligence.md +535 -0
- icdev/data/docs/features/phase-60-cpmp.md +528 -0
- icdev/data/docs/features/phase-61-orchestration-improvements.md +534 -0
- icdev/data/docs/operations/dashboard-guide.md +354 -0
- icdev/data/docs/operations/deployment-guide.md +556 -0
- icdev/data/docs/operations/saas-admin-guide.md +439 -0
- icdev/data/docs/operations/security-operations-guide.md +733 -0
- icdev/data/docs/runbooks/backup-restore.md +412 -0
- icdev/data/docs/runbooks/troubleshooting.md +499 -0
- icdev/data/features/__init__.py +1 -0
- icdev/data/features/cicd_integration.feature +41 -0
- icdev/data/features/compliance_gates.feature +46 -0
- icdev/data/features/dashboard.feature +72 -0
- icdev/data/features/environment.py +25 -0
- icdev/data/features/project_management.feature +32 -0
- icdev/data/features/requirements_intake.feature +42 -0
- icdev/data/features/saas_platform.feature +53 -0
- icdev/data/features/security_scanning.feature +36 -0
- icdev/data/features/steps/__init__.py +1 -0
- icdev/data/features/steps/cicd_steps.py +465 -0
- icdev/data/features/steps/compliance_steps.py +308 -0
- icdev/data/features/steps/dashboard_steps.py +88 -0
- icdev/data/features/steps/project_steps.py +126 -0
- icdev/data/features/steps/requirements_intake_steps.py +689 -0
- icdev/data/features/steps/saas_platform_steps.py +572 -0
- icdev/data/features/steps/security_steps.py +236 -0
- icdev/data/features/steps/testing_steps.py +226 -0
- icdev/data/features/testing_pipeline.feature +42 -0
- icdev/data/goals/__init__.py +1 -0
- icdev/data/goals/agent_management.md +144 -0
- icdev/data/goals/agentic_generation.md +345 -0
- icdev/data/goals/agentic_threat_model.md +309 -0
- icdev/data/goals/ai_accountability.md +90 -0
- icdev/data/goals/ai_governance_intake.md +132 -0
- icdev/data/goals/ai_transparency.md +76 -0
- icdev/data/goals/atlas_integration.md +405 -0
- icdev/data/goals/ato_acceleration.md +139 -0
- icdev/data/goals/boundary_supply_chain.md +206 -0
- icdev/data/goals/build_app.md +544 -0
- icdev/data/goals/cicd_integration.md +86 -0
- icdev/data/goals/claude_dir_maintenance.md +77 -0
- icdev/data/goals/cli_capabilities.md +340 -0
- icdev/data/goals/cloud_agnostic.md +312 -0
- icdev/data/goals/code_intelligence.md +197 -0
- icdev/data/goals/code_review.md +94 -0
- icdev/data/goals/compliance_workflow.md +858 -0
- icdev/data/goals/continuous_harmonization.md +140 -0
- icdev/data/goals/cross_language_translation.md +171 -0
- icdev/data/goals/dashboard.md +142 -0
- icdev/data/goals/deploy_workflow.md +390 -0
- icdev/data/goals/devsecops_workflow.md +408 -0
- icdev/data/goals/evolutionary_intelligence.md +305 -0
- icdev/data/goals/external_integration.md +113 -0
- icdev/data/goals/framework_planning.md +63 -0
- icdev/data/goals/init_project.md +235 -0
- icdev/data/goals/innovation_engine.md +199 -0
- icdev/data/goals/integration_testing.md +189 -0
- icdev/data/goals/maintenance_audit.md +196 -0
- icdev/data/goals/manifest.md +56 -0
- icdev/data/goals/mbse_integration.md +504 -0
- icdev/data/goals/modernization_workflow.md +618 -0
- icdev/data/goals/monitoring.md +126 -0
- icdev/data/goals/mosa_workflow.md +463 -0
- icdev/data/goals/multi_agent_orchestration.md +68 -0
- icdev/data/goals/nlq_compliance.md +63 -0
- icdev/data/goals/observability.md +64 -0
- icdev/data/goals/observability_traceability_xai.md +154 -0
- icdev/data/goals/owasp_agentic_security.md +395 -0
- icdev/data/goals/parallel_cicd.md +61 -0
- icdev/data/goals/requirements_intake.md +213 -0
- icdev/data/goals/sbd_ivv_workflow.md +195 -0
- icdev/data/goals/security_categorization.md +133 -0
- icdev/data/goals/security_scan.md +381 -0
- icdev/data/goals/self_healing.md +120 -0
- icdev/data/goals/simulation_engine.md +111 -0
- icdev/data/goals/tdd_workflow.md +403 -0
- icdev/data/goals/zero_trust_architecture.md +403 -0
- icdev/data/hardprompts/__init__.py +1 -0
- icdev/data/hardprompts/agent/__init__.py +1 -0
- icdev/data/hardprompts/agent/agentic_architect.md +100 -0
- icdev/data/hardprompts/agent/debate_prompt.md +32 -0
- icdev/data/hardprompts/agent/fitness_evaluation.md +48 -0
- icdev/data/hardprompts/agent/governance_review.md +214 -0
- icdev/data/hardprompts/agent/reviewer_prompt.md +34 -0
- icdev/data/hardprompts/agent/skill_design.md +172 -0
- icdev/data/hardprompts/agent/task_decomposition.md +275 -0
- icdev/data/hardprompts/agent/veto_check_prompt.md +33 -0
- icdev/data/hardprompts/architect/__init__.py +1 -0
- icdev/data/hardprompts/architect/api_design.md +283 -0
- icdev/data/hardprompts/architect/data_model.md +277 -0
- icdev/data/hardprompts/architect/system_design.md +180 -0
- icdev/data/hardprompts/builder/__init__.py +1 -0
- icdev/data/hardprompts/builder/code_generation.md +59 -0
- icdev/data/hardprompts/builder/refactor.md +58 -0
- icdev/data/hardprompts/builder/scaffold_project.md +69 -0
- icdev/data/hardprompts/builder/test_generation.md +87 -0
- icdev/data/hardprompts/ci/__init__.py +1 -0
- icdev/data/hardprompts/ci/worktree_setup.md +35 -0
- icdev/data/hardprompts/compliance/__init__.py +1 -0
- icdev/data/hardprompts/compliance/cmmc_assessment.md +63 -0
- icdev/data/hardprompts/compliance/cssp_assessment.md +75 -0
- icdev/data/hardprompts/compliance/cui_marking.md +86 -0
- icdev/data/hardprompts/compliance/fedramp_assessment.md +55 -0
- icdev/data/hardprompts/compliance/ivv_assessment.md +96 -0
- icdev/data/hardprompts/compliance/poam_generation.md +57 -0
- icdev/data/hardprompts/compliance/sbd_assessment.md +101 -0
- icdev/data/hardprompts/compliance/security_categorization.md +74 -0
- icdev/data/hardprompts/compliance/ssp_generation.md +56 -0
- icdev/data/hardprompts/compliance/stig_evaluation.md +63 -0
- icdev/data/hardprompts/dashboard/__init__.py +1 -0
- icdev/data/hardprompts/dashboard/nlq_system_prompt.md +26 -0
- icdev/data/hardprompts/infra/__init__.py +1 -0
- icdev/data/hardprompts/infra/k8s_manifests.md +118 -0
- icdev/data/hardprompts/infra/pipeline_generation.md +160 -0
- icdev/data/hardprompts/infra/terraform_generation.md +92 -0
- icdev/data/hardprompts/integration/__init__.py +1 -0
- icdev/data/hardprompts/integration/approval_review.md +17 -0
- icdev/data/hardprompts/integration/jira_mapping.md +25 -0
- icdev/data/hardprompts/integration/servicenow_mapping.md +14 -0
- icdev/data/hardprompts/knowledge/__init__.py +1 -0
- icdev/data/hardprompts/knowledge/pattern_detection.md +73 -0
- icdev/data/hardprompts/knowledge/recommendation_engine.md +90 -0
- icdev/data/hardprompts/knowledge/root_cause_analysis.md +91 -0
- icdev/data/hardprompts/maintenance/__init__.py +1 -0
- icdev/data/hardprompts/maintenance/maintenance_assessment.md +82 -0
- icdev/data/hardprompts/mbse/__init__.py +1 -0
- icdev/data/hardprompts/mbse/digital_thread.md +67 -0
- icdev/data/hardprompts/mbse/model_import.md +62 -0
- icdev/data/hardprompts/mbse/model_to_code.md +65 -0
- icdev/data/hardprompts/modernization/__init__.py +1 -0
- icdev/data/hardprompts/modernization/legacy_analysis.md +93 -0
- icdev/data/hardprompts/modernization/migration_planning.md +150 -0
- icdev/data/hardprompts/modernization/seven_r_assessment.md +107 -0
- icdev/data/hardprompts/requirements/__init__.py +1 -0
- icdev/data/hardprompts/requirements/bdd_generation.md +35 -0
- icdev/data/hardprompts/requirements/clarification_prioritization.md +29 -0
- icdev/data/hardprompts/requirements/decomposition.md +60 -0
- icdev/data/hardprompts/requirements/document_extraction.md +45 -0
- icdev/data/hardprompts/requirements/gap_detection.md +70 -0
- icdev/data/hardprompts/requirements/intake_conversation.md +101 -0
- icdev/data/hardprompts/requirements/readiness_assessment.md +39 -0
- icdev/data/hardprompts/requirements/spec_quality.md +33 -0
- icdev/data/hardprompts/requirements/traceability_analysis.md +23 -0
- icdev/data/hardprompts/security/__init__.py +1 -0
- icdev/data/hardprompts/security/endpoint_security.md +78 -0
- icdev/data/hardprompts/security/threat_model.md +70 -0
- icdev/data/hardprompts/security/vulnerability_assessment.md +81 -0
- icdev/data/hardprompts/simulation/__init__.py +1 -0
- icdev/data/hardprompts/simulation/architecture_impact.md +27 -0
- icdev/data/hardprompts/simulation/coa_alternative.md +27 -0
- icdev/data/hardprompts/simulation/coa_generation.md +25 -0
- icdev/data/hardprompts/simulation/compliance_impact.md +28 -0
- icdev/data/hardprompts/simulation/cost_estimation.md +33 -0
- icdev/data/hardprompts/simulation/risk_assessment.md +28 -0
- icdev/data/hardprompts/translation/code_translation.md +68 -0
- icdev/data/hardprompts/translation/dependency_suggestion.md +44 -0
- icdev/data/hardprompts/translation/test_translation.md +64 -0
- icdev/data/hardprompts/translation/translation_repair.md +59 -0
- icdev/py.typed +0 -0
- icdev/tools/__init__.py +1 -0
- icdev/tools/_gen_formatter.py +12 -0
- icdev/tools/a2a/__init__.py +1 -0
- icdev/tools/a2a/agent_cards/architect.json +43 -0
- icdev/tools/a2a/agent_cards/builder.json +50 -0
- icdev/tools/a2a/agent_cards/compliance.json +57 -0
- icdev/tools/a2a/agent_cards/devsecops.json +71 -0
- icdev/tools/a2a/agent_cards/infra.json +57 -0
- icdev/tools/a2a/agent_cards/integration.json +57 -0
- icdev/tools/a2a/agent_cards/knowledge.json +43 -0
- icdev/tools/a2a/agent_cards/mbse.json +57 -0
- icdev/tools/a2a/agent_cards/modernization.json +50 -0
- icdev/tools/a2a/agent_cards/monitor.json +43 -0
- icdev/tools/a2a/agent_cards/orchestrator.json +36 -0
- icdev/tools/a2a/agent_cards/requirements_analyst.json +64 -0
- icdev/tools/a2a/agent_cards/security.json +50 -0
- icdev/tools/a2a/agent_cards/simulation.json +57 -0
- icdev/tools/a2a/agent_cards/supply_chain.json +50 -0
- icdev/tools/a2a/agent_client.py +349 -0
- icdev/tools/a2a/agent_registry.py +412 -0
- icdev/tools/a2a/agent_server.py +579 -0
- icdev/tools/a2a/task.py +200 -0
- icdev/tools/agent/__init__.py +2 -0
- icdev/tools/agent/a2a_agent_card_generator.py +285 -0
- icdev/tools/agent/a2a_discovery_server.py +250 -0
- icdev/tools/agent/agent_executor.py +529 -0
- icdev/tools/agent/agent_memory.py +557 -0
- icdev/tools/agent/agent_models.py +51 -0
- icdev/tools/agent/atlas_critique.py +908 -0
- icdev/tools/agent/authority.py +443 -0
- icdev/tools/agent/bedrock_client.py +1075 -0
- icdev/tools/agent/collaboration.py +871 -0
- icdev/tools/agent/dispatcher_mode.py +665 -0
- icdev/tools/agent/mailbox.py +575 -0
- icdev/tools/agent/prompt_chain_executor.py +1064 -0
- icdev/tools/agent/session_purpose.py +350 -0
- icdev/tools/agent/skill_router.py +638 -0
- icdev/tools/agent/skill_selector.py +486 -0
- icdev/tools/agent/team_orchestrator.py +1108 -0
- icdev/tools/agent/token_tracker.py +290 -0
- icdev/tools/analysis/__init__.py +1 -0
- icdev/tools/analysis/code_analyzer.py +780 -0
- icdev/tools/analysis/runtime_feedback.py +389 -0
- icdev/tools/audit/__init__.py +1 -0
- icdev/tools/audit/audit_logger.py +196 -0
- icdev/tools/audit/audit_query.py +157 -0
- icdev/tools/audit/decision_recorder.py +72 -0
- icdev/tools/builder/__init__.py +1 -0
- icdev/tools/builder/agentic_fitness.py +534 -0
- icdev/tools/builder/agentic_test_templates/test_a2a_callback.py +117 -0
- icdev/tools/builder/agentic_test_templates/test_a2a_lifecycle.feature +52 -0
- icdev/tools/builder/agentic_test_templates/test_agent_card.feature +37 -0
- icdev/tools/builder/agentic_test_templates/test_agent_health.py +128 -0
- icdev/tools/builder/agentic_test_templates/test_memory_system.feature +50 -0
- icdev/tools/builder/agentic_test_templates/test_skill_execution.feature +40 -0
- icdev/tools/builder/app_blueprint.py +1583 -0
- icdev/tools/builder/child_app_generator.py +2852 -0
- icdev/tools/builder/claude_md_generator.py +1734 -0
- icdev/tools/builder/code_generator.py +3703 -0
- icdev/tools/builder/db_init_generator.py +1709 -0
- icdev/tools/builder/dev_profile_manager.py +954 -0
- icdev/tools/builder/formatter.py +768 -0
- icdev/tools/builder/goal_adapter.py +592 -0
- icdev/tools/builder/gotcha_validator.py +812 -0
- icdev/tools/builder/language_support.py +441 -0
- icdev/tools/builder/linter.py +976 -0
- icdev/tools/builder/profile_detector.py +657 -0
- icdev/tools/builder/profile_md_generator.py +723 -0
- icdev/tools/builder/scaffolder.py +1590 -0
- icdev/tools/builder/scaffolder_extended.py +1771 -0
- icdev/tools/builder/test_writer.py +950 -0
- icdev/tools/ci/__init__.py +2 -0
- icdev/tools/ci/connectors/__init__.py +2 -0
- icdev/tools/ci/connectors/base_connector.py +80 -0
- icdev/tools/ci/connectors/connector_registry.py +188 -0
- icdev/tools/ci/connectors/mattermost_connector.py +159 -0
- icdev/tools/ci/connectors/slack_connector.py +197 -0
- icdev/tools/ci/core/__init__.py +2 -0
- icdev/tools/ci/core/air_gap_detector.py +115 -0
- icdev/tools/ci/core/comment_handler.py +192 -0
- icdev/tools/ci/core/conversation_manager.py +479 -0
- icdev/tools/ci/core/event_envelope.py +500 -0
- icdev/tools/ci/core/event_router.py +443 -0
- icdev/tools/ci/core/failure_parser.py +397 -0
- icdev/tools/ci/core/recovery_engine.py +527 -0
- icdev/tools/ci/modules/__init__.py +2 -0
- icdev/tools/ci/modules/agent.py +271 -0
- icdev/tools/ci/modules/git_ops.py +175 -0
- icdev/tools/ci/modules/state.py +117 -0
- icdev/tools/ci/modules/vcs.py +303 -0
- icdev/tools/ci/modules/workflow_ops.py +295 -0
- icdev/tools/ci/modules/worktree.py +340 -0
- icdev/tools/ci/pipeline_config_generator.py +558 -0
- icdev/tools/ci/triggers/__init__.py +2 -0
- icdev/tools/ci/triggers/gitlab_task_monitor.py +330 -0
- icdev/tools/ci/triggers/poll_trigger.py +237 -0
- icdev/tools/ci/triggers/webhook_server.py +356 -0
- icdev/tools/ci/workflows/__init__.py +2 -0
- icdev/tools/ci/workflows/icdev_build.py +140 -0
- icdev/tools/ci/workflows/icdev_comply.py +284 -0
- icdev/tools/ci/workflows/icdev_document.py +152 -0
- icdev/tools/ci/workflows/icdev_e2e.py +188 -0
- icdev/tools/ci/workflows/icdev_patch.py +186 -0
- icdev/tools/ci/workflows/icdev_plan.py +202 -0
- icdev/tools/ci/workflows/icdev_plan_build.py +41 -0
- icdev/tools/ci/workflows/icdev_plan_build_test.py +46 -0
- icdev/tools/ci/workflows/icdev_plan_build_test_review.py +47 -0
- icdev/tools/ci/workflows/icdev_review.py +126 -0
- icdev/tools/ci/workflows/icdev_sdlc.py +261 -0
- icdev/tools/ci/workflows/icdev_test.py +240 -0
- icdev/tools/cli/__init__.py +1 -0
- icdev/tools/cli/output_formatter.py +756 -0
- icdev/tools/cli_formatter.py +42 -0
- icdev/tools/cloud/__init__.py +11 -0
- icdev/tools/cloud/cloud_mode_manager.py +364 -0
- icdev/tools/cloud/csp_changelog.py +383 -0
- icdev/tools/cloud/csp_health_checker.py +268 -0
- icdev/tools/cloud/csp_monitor.py +951 -0
- icdev/tools/cloud/iam_provider.py +593 -0
- icdev/tools/cloud/kms_provider.py +346 -0
- icdev/tools/cloud/monitoring_provider.py +628 -0
- icdev/tools/cloud/provider_factory.py +376 -0
- icdev/tools/cloud/region_validator.py +345 -0
- icdev/tools/cloud/registry_provider.py +563 -0
- icdev/tools/cloud/secrets_provider.py +486 -0
- icdev/tools/cloud/storage_provider.py +446 -0
- icdev/tools/compat/__init__.py +21 -0
- icdev/tools/compat/cli_harmonizer.py +251 -0
- icdev/tools/compat/datetime_utils.py +18 -0
- icdev/tools/compat/db_utils.py +160 -0
- icdev/tools/compat/platform_utils.py +123 -0
- icdev/tools/compliance/__init__.py +1 -0
- icdev/tools/compliance/accountability_manager.py +397 -0
- icdev/tools/compliance/ai_accountability_audit.py +294 -0
- icdev/tools/compliance/ai_impact_assessor.py +273 -0
- icdev/tools/compliance/ai_incident_response.py +301 -0
- icdev/tools/compliance/ai_inventory_manager.py +239 -0
- icdev/tools/compliance/ai_reassessment_scheduler.py +256 -0
- icdev/tools/compliance/ai_transparency_audit.py +248 -0
- icdev/tools/compliance/atlas_assessor.py +278 -0
- icdev/tools/compliance/atlas_report_generator.py +1211 -0
- icdev/tools/compliance/base_assessor.py +597 -0
- icdev/tools/compliance/cato_monitor.py +1385 -0
- icdev/tools/compliance/cato_scheduler.py +699 -0
- icdev/tools/compliance/cjis_assessor.py +76 -0
- icdev/tools/compliance/classification_manager.py +1353 -0
- icdev/tools/compliance/cmmc_assessor.py +1491 -0
- icdev/tools/compliance/cmmc_report_generator.py +1100 -0
- icdev/tools/compliance/compliance_detector.py +463 -0
- icdev/tools/compliance/compliance_exporter.py +427 -0
- icdev/tools/compliance/compliance_status.py +825 -0
- icdev/tools/compliance/control_mapper.py +505 -0
- icdev/tools/compliance/crosswalk_engine.py +1203 -0
- icdev/tools/compliance/cssp_assessor.py +1045 -0
- icdev/tools/compliance/cssp_evidence_collector.py +729 -0
- icdev/tools/compliance/cssp_report_generator.py +1116 -0
- icdev/tools/compliance/cui_marker.py +388 -0
- icdev/tools/compliance/diagram_validator.py +600 -0
- icdev/tools/compliance/emass/__init__.py +2 -0
- icdev/tools/compliance/emass/emass_client.py +840 -0
- icdev/tools/compliance/emass/emass_export.py +777 -0
- icdev/tools/compliance/emass/emass_sync.py +826 -0
- icdev/tools/compliance/eu_ai_act_classifier.py +194 -0
- icdev/tools/compliance/evidence_collector.py +468 -0
- icdev/tools/compliance/fairness_assessor.py +316 -0
- icdev/tools/compliance/fedramp_assessor.py +1808 -0
- icdev/tools/compliance/fedramp_authorization_packager.py +137 -0
- icdev/tools/compliance/fedramp_ksi_generator.py +355 -0
- icdev/tools/compliance/fedramp_report_generator.py +1128 -0
- icdev/tools/compliance/fips199_categorizer.py +881 -0
- icdev/tools/compliance/fips200_validator.py +315 -0
- icdev/tools/compliance/gao_ai_assessor.py +231 -0
- icdev/tools/compliance/gao_evidence_builder.py +308 -0
- icdev/tools/compliance/hipaa_assessor.py +78 -0
- icdev/tools/compliance/hitrust_assessor.py +49 -0
- icdev/tools/compliance/incident_response_plan.py +718 -0
- icdev/tools/compliance/iso27001_assessor.py +92 -0
- icdev/tools/compliance/iso42001_assessor.py +114 -0
- icdev/tools/compliance/ivv_assessor.py +2327 -0
- icdev/tools/compliance/ivv_report_generator.py +1662 -0
- icdev/tools/compliance/model_card_generator.py +297 -0
- icdev/tools/compliance/mosa_assessor.py +117 -0
- icdev/tools/compliance/multi_regime_assessor.py +451 -0
- icdev/tools/compliance/narrative_generator.py +1013 -0
- icdev/tools/compliance/nist_800_207_assessor.py +191 -0
- icdev/tools/compliance/nist_ai_600_1_assessor.py +188 -0
- icdev/tools/compliance/nist_ai_rmf_assessor.py +110 -0
- icdev/tools/compliance/nist_lookup.py +245 -0
- icdev/tools/compliance/omb_m25_21_assessor.py +228 -0
- icdev/tools/compliance/omb_m26_04_assessor.py +188 -0
- icdev/tools/compliance/oscal_catalog_adapter.py +395 -0
- icdev/tools/compliance/oscal_generator.py +2170 -0
- icdev/tools/compliance/oscal_tools.py +1182 -0
- icdev/tools/compliance/owasp_agentic_assessor.py +226 -0
- icdev/tools/compliance/owasp_asi_assessor.py +200 -0
- icdev/tools/compliance/owasp_llm_assessor.py +244 -0
- icdev/tools/compliance/pci_dss_assessor.py +80 -0
- icdev/tools/compliance/pi_compliance_tracker.py +1461 -0
- icdev/tools/compliance/poam_generator.py +405 -0
- icdev/tools/compliance/resolve_marking.py +283 -0
- icdev/tools/compliance/sbd_assessor.py +2068 -0
- icdev/tools/compliance/sbd_report_generator.py +1236 -0
- icdev/tools/compliance/sbom_generator.py +1008 -0
- icdev/tools/compliance/siem_config_generator.py +674 -0
- icdev/tools/compliance/slsa_attestation_generator.py +490 -0
- icdev/tools/compliance/soc2_assessor.py +77 -0
- icdev/tools/compliance/ssp_generator.py +573 -0
- icdev/tools/compliance/stig_checker.py +727 -0
- icdev/tools/compliance/swft_evidence_bundler.py +337 -0
- icdev/tools/compliance/system_card_generator.py +309 -0
- icdev/tools/compliance/traceability_matrix.py +1281 -0
- icdev/tools/compliance/universal_classification_manager.py +1172 -0
- icdev/tools/compliance/xacta/__init__.py +2 -0
- icdev/tools/compliance/xacta/xacta_client.py +449 -0
- icdev/tools/compliance/xacta/xacta_export.py +557 -0
- icdev/tools/compliance/xacta/xacta_sync.py +333 -0
- icdev/tools/compliance/xai_assessor.py +231 -0
- icdev/tools/dashboard/__init__.py +1 -0
- icdev/tools/dashboard/api/__init__.py +1 -0
- icdev/tools/dashboard/api/_pipeline_state.py +17 -0
- icdev/tools/dashboard/api/activity.py +206 -0
- icdev/tools/dashboard/api/admin.py +176 -0
- icdev/tools/dashboard/api/agents.py +53 -0
- icdev/tools/dashboard/api/ai_accountability.py +163 -0
- icdev/tools/dashboard/api/ai_transparency.py +198 -0
- icdev/tools/dashboard/api/audit.py +58 -0
- icdev/tools/dashboard/api/batch.py +666 -0
- icdev/tools/dashboard/api/chat.py +241 -0
- icdev/tools/dashboard/api/cicd.py +219 -0
- icdev/tools/dashboard/api/code_quality.py +223 -0
- icdev/tools/dashboard/api/compliance.py +171 -0
- icdev/tools/dashboard/api/cpmp.py +915 -0
- icdev/tools/dashboard/api/diagrams.py +65 -0
- icdev/tools/dashboard/api/events.py +250 -0
- icdev/tools/dashboard/api/evidence.py +99 -0
- icdev/tools/dashboard/api/fedramp_20x.py +77 -0
- icdev/tools/dashboard/api/govcon.py +1095 -0
- icdev/tools/dashboard/api/intake.py +1171 -0
- icdev/tools/dashboard/api/lineage.py +163 -0
- icdev/tools/dashboard/api/metrics.py +155 -0
- icdev/tools/dashboard/api/nlq.py +72 -0
- icdev/tools/dashboard/api/orchestration.py +472 -0
- icdev/tools/dashboard/api/oscal.py +183 -0
- icdev/tools/dashboard/api/prod_audit.py +183 -0
- icdev/tools/dashboard/api/projects.py +191 -0
- icdev/tools/dashboard/api/proposals.py +1084 -0
- icdev/tools/dashboard/api/traces.py +363 -0
- icdev/tools/dashboard/api/usage.py +234 -0
- icdev/tools/dashboard/app.py +1986 -0
- icdev/tools/dashboard/auth.py +500 -0
- icdev/tools/dashboard/byok.py +245 -0
- icdev/tools/dashboard/chat_manager.py +675 -0
- icdev/tools/dashboard/config.py +116 -0
- icdev/tools/dashboard/diagram_definitions.py +642 -0
- icdev/tools/dashboard/nlq_processor.py +323 -0
- icdev/tools/dashboard/phase_loader.py +136 -0
- icdev/tools/dashboard/sse_manager.py +89 -0
- icdev/tools/dashboard/state_tracker.py +267 -0
- icdev/tools/dashboard/static/css/style.css +706 -0
- icdev/tools/dashboard/static/css/ux.css +2047 -0
- icdev/tools/dashboard/static/js/activity.js +322 -0
- icdev/tools/dashboard/static/js/api.js +161 -0
- icdev/tools/dashboard/static/js/batch.js +814 -0
- icdev/tools/dashboard/static/js/charts.js +618 -0
- icdev/tools/dashboard/static/js/chat.js +1514 -0
- icdev/tools/dashboard/static/js/kanban.js +113 -0
- icdev/tools/dashboard/static/js/live.js +569 -0
- icdev/tools/dashboard/static/js/mermaid-icdev.js +332 -0
- icdev/tools/dashboard/static/js/proposals.js +588 -0
- icdev/tools/dashboard/static/js/shortcuts.js +544 -0
- icdev/tools/dashboard/static/js/tables.js +652 -0
- icdev/tools/dashboard/static/js/tour.js +524 -0
- icdev/tools/dashboard/static/js/ux.js +942 -0
- icdev/tools/dashboard/templates/404.html +10 -0
- icdev/tools/dashboard/templates/activity.html +80 -0
- icdev/tools/dashboard/templates/admin/users.html +144 -0
- icdev/tools/dashboard/templates/ai_accountability.html +235 -0
- icdev/tools/dashboard/templates/ai_transparency.html +263 -0
- icdev/tools/dashboard/templates/base.html +104 -0
- icdev/tools/dashboard/templates/batch.html +23 -0
- icdev/tools/dashboard/templates/chat.html +332 -0
- icdev/tools/dashboard/templates/children.html +149 -0
- icdev/tools/dashboard/templates/cicd.html +253 -0
- icdev/tools/dashboard/templates/code_quality.html +214 -0
- icdev/tools/dashboard/templates/cpmp/cor_detail.html +220 -0
- icdev/tools/dashboard/templates/cpmp/cor_portal.html +91 -0
- icdev/tools/dashboard/templates/cpmp/deliverable_detail.html +197 -0
- icdev/tools/dashboard/templates/cpmp/detail.html +578 -0
- icdev/tools/dashboard/templates/cpmp/portfolio.html +202 -0
- icdev/tools/dashboard/templates/dev_profiles.html +304 -0
- icdev/tools/dashboard/templates/diagrams.html +224 -0
- icdev/tools/dashboard/templates/events/timeline.html +232 -0
- icdev/tools/dashboard/templates/evidence.html +134 -0
- icdev/tools/dashboard/templates/fedramp_20x.html +207 -0
- icdev/tools/dashboard/templates/gateway.html +244 -0
- icdev/tools/dashboard/templates/govcon/capabilities.html +135 -0
- icdev/tools/dashboard/templates/govcon/pipeline.html +214 -0
- icdev/tools/dashboard/templates/govcon/requirements.html +120 -0
- icdev/tools/dashboard/templates/index.html +254 -0
- icdev/tools/dashboard/templates/lineage.html +141 -0
- icdev/tools/dashboard/templates/login.html +51 -0
- icdev/tools/dashboard/templates/monitoring/overview.html +193 -0
- icdev/tools/dashboard/templates/orchestration/dashboard.html +545 -0
- icdev/tools/dashboard/templates/oscal.html +263 -0
- icdev/tools/dashboard/templates/phases.html +150 -0
- icdev/tools/dashboard/templates/prod_audit.html +280 -0
- icdev/tools/dashboard/templates/profile.html +183 -0
- icdev/tools/dashboard/templates/projects/detail.html +583 -0
- icdev/tools/dashboard/templates/projects/list.html +47 -0
- icdev/tools/dashboard/templates/proposals/detail.html +1253 -0
- icdev/tools/dashboard/templates/proposals/list.html +179 -0
- icdev/tools/dashboard/templates/proposals/section_detail.html +193 -0
- icdev/tools/dashboard/templates/provenance.html +181 -0
- icdev/tools/dashboard/templates/query/nlq.html +234 -0
- icdev/tools/dashboard/templates/quick_paths.html +69 -0
- icdev/tools/dashboard/templates/traces.html +155 -0
- icdev/tools/dashboard/templates/translation_detail.html +199 -0
- icdev/tools/dashboard/templates/translations.html +162 -0
- icdev/tools/dashboard/templates/usage.html +225 -0
- icdev/tools/dashboard/templates/wizard.html +539 -0
- icdev/tools/dashboard/templates/xai.html +208 -0
- icdev/tools/dashboard/ux_helpers.py +962 -0
- icdev/tools/dashboard/websocket.py +81 -0
- icdev/tools/db/__init__.py +1 -0
- icdev/tools/db/backup.py +312 -0
- icdev/tools/db/backup_manager.py +832 -0
- icdev/tools/db/init_icdev_db.py +5900 -0
- icdev/tools/db/migrate.py +178 -0
- icdev/tools/db/migration_runner.py +549 -0
- icdev/tools/db/migrations/001_baseline/meta.json +9 -0
- icdev/tools/db/migrations/001_baseline/up.py +68 -0
- icdev/tools/db/migrations/002_memory_enhancements/down.sql +8 -0
- icdev/tools/db/migrations/002_memory_enhancements/meta.json +9 -0
- icdev/tools/db/migrations/002_memory_enhancements/up.py +118 -0
- icdev/tools/db/migrations/003_dev_profiles/meta.json +8 -0
- icdev/tools/db/migrations/003_dev_profiles/up.py +93 -0
- icdev/tools/db/migrations/004_innovation_engine/down.py +19 -0
- icdev/tools/db/migrations/004_innovation_engine/up.py +227 -0
- icdev/tools/db/migrations/005_phase_37_ai_security/down.py +19 -0
- icdev/tools/db/migrations/005_phase_37_ai_security/up.py +258 -0
- icdev/tools/db/migrations/006_phase_36_evolution/down.py +21 -0
- icdev/tools/db/migrations/006_phase_36_evolution/up.py +323 -0
- icdev/tools/db/migrations/007_phase_38_cloud/down.py +14 -0
- icdev/tools/db/migrations/007_phase_38_cloud/up.py +110 -0
- icdev/tools/db/migrations/008_phase36_37_integration/up.py +55 -0
- icdev/tools/db/migrations/__init__.py +2 -0
- icdev/tools/devsecops/__init__.py +2 -0
- icdev/tools/devsecops/attestation_manager.py +458 -0
- icdev/tools/devsecops/network_segmentation_generator.py +614 -0
- icdev/tools/devsecops/pdp_config_generator.py +1256 -0
- icdev/tools/devsecops/pipeline_security_generator.py +484 -0
- icdev/tools/devsecops/policy_generator.py +653 -0
- icdev/tools/devsecops/profile_manager.py +388 -0
- icdev/tools/devsecops/service_mesh_generator.py +1073 -0
- icdev/tools/devsecops/zta_maturity_scorer.py +368 -0
- icdev/tools/devsecops/zta_terraform_generator.py +1303 -0
- icdev/tools/dx/__init__.py +3 -0
- icdev/tools/dx/companion.py +266 -0
- icdev/tools/dx/instruction_generator.py +753 -0
- icdev/tools/dx/mcp_config_generator.py +282 -0
- icdev/tools/dx/skill_translator.py +425 -0
- icdev/tools/dx/tool_detector.py +144 -0
- icdev/tools/extensions/__init__.py +21 -0
- icdev/tools/extensions/builtins/010_ai_governance_chat.py +277 -0
- icdev/tools/extensions/builtins/__init__.py +2 -0
- icdev/tools/extensions/extension_manager.py +455 -0
- icdev/tools/infra/__init__.py +1 -0
- icdev/tools/infra/ansible_generator.py +869 -0
- icdev/tools/infra/dockerfile_generator.py +361 -0
- icdev/tools/infra/infra_status.py +393 -0
- icdev/tools/infra/ironbank_metadata_generator.py +411 -0
- icdev/tools/infra/k8s_generator.py +1002 -0
- icdev/tools/infra/pipeline_generator.py +832 -0
- icdev/tools/infra/rollback.py +400 -0
- icdev/tools/infra/terraform_generator.py +1142 -0
- icdev/tools/infra/terraform_generator_azure.py +1254 -0
- icdev/tools/infra/terraform_generator_gcp.py +953 -0
- icdev/tools/infra/terraform_generator_ibm.py +360 -0
- icdev/tools/infra/terraform_generator_oci.py +919 -0
- icdev/tools/infra/terraform_generator_onprem.py +319 -0
- icdev/tools/innovation/__init__.py +8 -0
- icdev/tools/innovation/competitive_intel.py +492 -0
- icdev/tools/innovation/innovation_manager.py +681 -0
- icdev/tools/innovation/introspective_analyzer.py +774 -0
- icdev/tools/innovation/register_external_patterns.py +440 -0
- icdev/tools/innovation/signal_ranker.py +1038 -0
- icdev/tools/innovation/solution_generator.py +697 -0
- icdev/tools/innovation/standards_monitor.py +466 -0
- icdev/tools/innovation/trend_detector.py +1046 -0
- icdev/tools/innovation/triage_engine.py +1149 -0
- icdev/tools/innovation/web_scanner.py +894 -0
- icdev/tools/installer/__init__.py +1 -0
- icdev/tools/installer/compliance_configurator.py +637 -0
- icdev/tools/installer/installer.py +1711 -0
- icdev/tools/installer/module_registry.py +805 -0
- icdev/tools/installer/platform_setup.py +961 -0
- icdev/tools/integration/__init__.py +2 -0
- icdev/tools/integration/approval_manager.py +561 -0
- icdev/tools/integration/doors_exporter.py +627 -0
- icdev/tools/integration/gitlab_connector.py +784 -0
- icdev/tools/integration/jira_connector.py +774 -0
- icdev/tools/integration/servicenow_connector.py +693 -0
- icdev/tools/knowledge/__init__.py +1 -0
- icdev/tools/knowledge/knowledge_ingest.py +293 -0
- icdev/tools/knowledge/pattern_detector.py +693 -0
- icdev/tools/knowledge/recommendation_engine.py +461 -0
- icdev/tools/knowledge/self_heal_analyzer.py +504 -0
- icdev/tools/llm/__init__.py +72 -0
- icdev/tools/llm/anthropic_provider.py +170 -0
- icdev/tools/llm/azure_openai_provider.py +338 -0
- icdev/tools/llm/bedrock_provider.py +315 -0
- icdev/tools/llm/embedding_provider.py +438 -0
- icdev/tools/llm/gemini_provider.py +381 -0
- icdev/tools/llm/ibm_watsonx_provider.py +232 -0
- icdev/tools/llm/oci_genai_provider.py +462 -0
- icdev/tools/llm/ollama_provider.py +340 -0
- icdev/tools/llm/openai_provider.py +225 -0
- icdev/tools/llm/provider.py +355 -0
- icdev/tools/llm/provider_sdk.py +175 -0
- icdev/tools/llm/router.py +780 -0
- icdev/tools/llm/vertex_ai_provider.py +374 -0
- icdev/tools/maintenance/__init__.py +2 -0
- icdev/tools/maintenance/dependency_scanner.py +1030 -0
- icdev/tools/maintenance/maintenance_auditor.py +815 -0
- icdev/tools/maintenance/remediation_engine.py +966 -0
- icdev/tools/maintenance/vulnerability_checker.py +987 -0
- icdev/tools/mbse/__init__.py +3 -0
- icdev/tools/mbse/des_assessor.py +1186 -0
- icdev/tools/mbse/des_report_generator.py +800 -0
- icdev/tools/mbse/diagram_extractor.py +811 -0
- icdev/tools/mbse/digital_thread.py +1665 -0
- icdev/tools/mbse/model_code_generator.py +1122 -0
- icdev/tools/mbse/model_control_mapper.py +420 -0
- icdev/tools/mbse/pi_model_tracker.py +1093 -0
- icdev/tools/mbse/reqif_parser.py +1483 -0
- icdev/tools/mbse/sync_engine.py +1805 -0
- icdev/tools/mbse/xmi_parser.py +1573 -0
- icdev/tools/mcp/__init__.py +1 -0
- icdev/tools/mcp/base_server.py +535 -0
- icdev/tools/mcp/builder_server.py +725 -0
- icdev/tools/mcp/compliance_server.py +1407 -0
- icdev/tools/mcp/context_indexer.py +199 -0
- icdev/tools/mcp/context_server.py +305 -0
- icdev/tools/mcp/core_server.py +679 -0
- icdev/tools/mcp/devsecops_server.py +432 -0
- icdev/tools/mcp/gap_handlers.py +1079 -0
- icdev/tools/mcp/gateway_server.py +339 -0
- icdev/tools/mcp/generate_registry.py +623 -0
- icdev/tools/mcp/infra_server.py +264 -0
- icdev/tools/mcp/innovation_server.py +316 -0
- icdev/tools/mcp/integration_server.py +527 -0
- icdev/tools/mcp/knowledge_server.py +429 -0
- icdev/tools/mcp/maintenance_server.py +248 -0
- icdev/tools/mcp/marketplace_server.py +499 -0
- icdev/tools/mcp/mbse_server.py +398 -0
- icdev/tools/mcp/modernization_server.py +496 -0
- icdev/tools/mcp/observability_server.py +354 -0
- icdev/tools/mcp/requirements_server.py +415 -0
- icdev/tools/mcp/simulation_server.py +468 -0
- icdev/tools/mcp/standalone/__init__.py +2 -0
- icdev/tools/mcp/standalone/builder.py +59 -0
- icdev/tools/mcp/standalone/compliance.py +59 -0
- icdev/tools/mcp/standalone/core.py +59 -0
- icdev/tools/mcp/standalone/knowledge.py +59 -0
- icdev/tools/mcp/standalone/maintenance.py +59 -0
- icdev/tools/mcp/supply_chain_server.py +476 -0
- icdev/tools/mcp/tool_registry.py +2008 -0
- icdev/tools/mcp/unified_server.py +158 -0
- icdev/tools/memory/__init__.py +2 -0
- icdev/tools/memory/auto_capture.py +347 -0
- icdev/tools/memory/embed_memory.py +158 -0
- icdev/tools/memory/history_compressor.py +334 -0
- icdev/tools/memory/hybrid_search.py +236 -0
- icdev/tools/memory/maintenance_cron.py +289 -0
- icdev/tools/memory/memory_consolidation.py +444 -0
- icdev/tools/memory/memory_db.py +133 -0
- icdev/tools/memory/memory_read.py +102 -0
- icdev/tools/memory/memory_write.py +222 -0
- icdev/tools/memory/semantic_search.py +139 -0
- icdev/tools/memory/time_decay.py +435 -0
- icdev/tools/modernization/__init__.py +3 -0
- icdev/tools/modernization/architecture_extractor.py +734 -0
- icdev/tools/modernization/compliance_bridge.py +1499 -0
- icdev/tools/modernization/db_migration_planner.py +1385 -0
- icdev/tools/modernization/doc_generator.py +1428 -0
- icdev/tools/modernization/framework_migrator.py +1525 -0
- icdev/tools/modernization/legacy_analyzer.py +1948 -0
- icdev/tools/modernization/migration_code_generator.py +1639 -0
- icdev/tools/modernization/migration_report_generator.py +1653 -0
- icdev/tools/modernization/migration_tracker.py +1726 -0
- icdev/tools/modernization/monolith_decomposer.py +1508 -0
- icdev/tools/modernization/seven_r_assessor.py +1658 -0
- icdev/tools/modernization/strangler_fig_manager.py +1705 -0
- icdev/tools/modernization/ui_analyzer.py +771 -0
- icdev/tools/modernization/version_migrator.py +1392 -0
- icdev/tools/monitor/__init__.py +1 -0
- icdev/tools/monitor/alert_correlator.py +495 -0
- icdev/tools/monitor/auto_resolver.py +612 -0
- icdev/tools/monitor/health_checker.py +509 -0
- icdev/tools/monitor/heartbeat_daemon.py +792 -0
- icdev/tools/monitor/log_analyzer.py +516 -0
- icdev/tools/monitor/metric_collector.py +496 -0
- icdev/tools/mosa/__init__.py +10 -0
- icdev/tools/mosa/icd_generator.py +370 -0
- icdev/tools/mosa/modular_design_analyzer.py +683 -0
- icdev/tools/mosa/mosa_code_enforcer.py +349 -0
- icdev/tools/mosa/tsp_generator.py +265 -0
- icdev/tools/observability/__init__.py +100 -0
- icdev/tools/observability/genai_attributes.py +88 -0
- icdev/tools/observability/instrumentation.py +140 -0
- icdev/tools/observability/mlflow_exporter.py +194 -0
- icdev/tools/observability/otel_tracer.py +168 -0
- icdev/tools/observability/provenance/__init__.py +3 -0
- icdev/tools/observability/provenance/prov_recorder.py +324 -0
- icdev/tools/observability/shap/__init__.py +3 -0
- icdev/tools/observability/shap/agent_shap.py +275 -0
- icdev/tools/observability/sqlite_tracer.py +361 -0
- icdev/tools/observability/trace_context.py +205 -0
- icdev/tools/observability/tracer.py +230 -0
- icdev/tools/orchestration/__init__.py +2 -0
- icdev/tools/orchestration/workflow_composer.py +361 -0
- icdev/tools/project/__init__.py +1 -0
- icdev/tools/project/manifest_loader.py +418 -0
- icdev/tools/project/project_create.py +350 -0
- icdev/tools/project/project_list.py +174 -0
- icdev/tools/project/project_scaffold.py +1715 -0
- icdev/tools/project/project_status.py +479 -0
- icdev/tools/project/session_context_builder.py +757 -0
- icdev/tools/project/validate_manifest.py +55 -0
- icdev/tools/registry/__init__.py +10 -0
- icdev/tools/registry/absorption_engine.py +832 -0
- icdev/tools/registry/capability_evaluator.py +668 -0
- icdev/tools/registry/child_registry.py +617 -0
- icdev/tools/registry/cross_pollinator.py +1065 -0
- icdev/tools/registry/genome_manager.py +671 -0
- icdev/tools/registry/learning_collector.py +912 -0
- icdev/tools/registry/propagation_manager.py +942 -0
- icdev/tools/registry/staging_manager.py +742 -0
- icdev/tools/registry/telemetry_collector.py +423 -0
- icdev/tools/requirements/__init__.py +1 -0
- icdev/tools/requirements/ai_governance_scorer.py +208 -0
- icdev/tools/requirements/boundary_analyzer.py +1293 -0
- icdev/tools/requirements/clarification_engine.py +618 -0
- icdev/tools/requirements/complexity_scorer.py +387 -0
- icdev/tools/requirements/consistency_analyzer.py +803 -0
- icdev/tools/requirements/constitution_manager.py +605 -0
- icdev/tools/requirements/decomposition_engine.py +778 -0
- icdev/tools/requirements/document_extractor.py +1016 -0
- icdev/tools/requirements/elicitation_techniques.py +519 -0
- icdev/tools/requirements/gap_detector.py +271 -0
- icdev/tools/requirements/intake_engine.py +2188 -0
- icdev/tools/requirements/prd_generator.py +847 -0
- icdev/tools/requirements/prd_validator.py +595 -0
- icdev/tools/requirements/readiness_scorer.py +313 -0
- icdev/tools/requirements/spec_organizer.py +1029 -0
- icdev/tools/requirements/spec_quality_checker.py +1097 -0
- icdev/tools/requirements/traceability_builder.py +579 -0
- icdev/tools/resilience/__init__.py +34 -0
- icdev/tools/resilience/circuit_breaker.py +340 -0
- icdev/tools/resilience/correlation.py +150 -0
- icdev/tools/resilience/errors.py +81 -0
- icdev/tools/resilience/retry.py +95 -0
- icdev/tools/schemas/__init__.py +27 -0
- icdev/tools/schemas/chat.py +61 -0
- icdev/tools/schemas/compliance.py +56 -0
- icdev/tools/schemas/core.py +85 -0
- icdev/tools/schemas/innovation.py +37 -0
- icdev/tools/schemas/validation.py +109 -0
- icdev/tools/sdk/__init__.py +3 -0
- icdev/tools/sdk/icdev_client.py +218 -0
- icdev/tools/security/__init__.py +1 -0
- icdev/tools/security/agent_output_validator.py +330 -0
- icdev/tools/security/agent_trust_scorer.py +466 -0
- icdev/tools/security/ai_bom_generator.py +725 -0
- icdev/tools/security/ai_telemetry_logger.py +469 -0
- icdev/tools/security/atlas_red_team.py +543 -0
- icdev/tools/security/code_pattern_scanner.py +378 -0
- icdev/tools/security/confabulation_detector.py +271 -0
- icdev/tools/security/container_scanner.py +491 -0
- icdev/tools/security/dependency_auditor.py +944 -0
- icdev/tools/security/endpoint_security_scanner.py +579 -0
- icdev/tools/security/mcp_tool_authorizer.py +243 -0
- icdev/tools/security/prompt_injection_detector.py +737 -0
- icdev/tools/security/sast_runner.py +948 -0
- icdev/tools/security/secret_detector.py +378 -0
- icdev/tools/security/tool_chain_validator.py +357 -0
- icdev/tools/security/vuln_scanner.py +539 -0
- icdev/tools/simulation/__init__.py +2 -0
- icdev/tools/simulation/coa_generator.py +1552 -0
- icdev/tools/simulation/monte_carlo.py +758 -0
- icdev/tools/simulation/scenario_manager.py +1073 -0
- icdev/tools/simulation/simulation_engine.py +1104 -0
- icdev/tools/supply_chain/__init__.py +2 -0
- icdev/tools/supply_chain/cve_triager.py +705 -0
- icdev/tools/supply_chain/dependency_graph.py +645 -0
- icdev/tools/supply_chain/isa_manager.py +540 -0
- icdev/tools/supply_chain/scrm_assessor.py +546 -0
- icdev/tools/testing/__init__.py +2 -0
- icdev/tools/testing/acceptance_validator.py +411 -0
- icdev/tools/testing/claude_dir_validator.py +831 -0
- icdev/tools/testing/data_types.py +199 -0
- icdev/tools/testing/e2e_runner.py +715 -0
- icdev/tools/testing/fuzz_cli.py +306 -0
- icdev/tools/testing/health_check.py +483 -0
- icdev/tools/testing/platform_check.py +143 -0
- icdev/tools/testing/production_audit.py +1862 -0
- icdev/tools/testing/production_remediate.py +804 -0
- icdev/tools/testing/screenshot_validator.py +539 -0
- icdev/tools/testing/smoke_test.py +283 -0
- icdev/tools/testing/test_agent_models.py +117 -0
- icdev/tools/testing/test_orchestrator.py +957 -0
- icdev/tools/testing/utils.py +229 -0
- icdev/tools/translation/__init__.py +17 -0
- icdev/tools/translation/code_translator.py +550 -0
- icdev/tools/translation/dependency_mapper.py +277 -0
- icdev/tools/translation/feature_map.py +395 -0
- icdev/tools/translation/project_assembler.py +439 -0
- icdev/tools/translation/source_extractor.py +609 -0
- icdev/tools/translation/test_translator.py +333 -0
- icdev/tools/translation/translation_manager.py +582 -0
- icdev/tools/translation/translation_validator.py +662 -0
- icdev/tools/translation/type_checker.py +371 -0
- icdev-1.0.0.dist-info/METADATA +868 -0
- icdev-1.0.0.dist-info/RECORD +1105 -0
- icdev-1.0.0.dist-info/WHEEL +5 -0
- icdev-1.0.0.dist-info/entry_points.txt +9 -0
- icdev-1.0.0.dist-info/licenses/LICENSE +254 -0
- icdev-1.0.0.dist-info/licenses/NOTICE +268 -0
- icdev-1.0.0.dist-info/top_level.txt +1 -0
|
@@ -0,0 +1,1065 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
# CUI // SP-CTI
|
|
3
|
+
# Controlled by: Department of Defense
|
|
4
|
+
# CUI Category: CTI
|
|
5
|
+
# Distribution: D
|
|
6
|
+
# POC: ICDEV System Administrator
|
|
7
|
+
"""Cross-Pollinator -- brokers capability sharing between child applications.
|
|
8
|
+
|
|
9
|
+
Capabilities proven in one child can be proposed for adoption by siblings.
|
|
10
|
+
All cross-pollination requires human-in-the-loop approval (REQ-36-040).
|
|
11
|
+
|
|
12
|
+
ADR D6: All proposals, approvals, and executions are append-only audit entries.
|
|
13
|
+
ADR D212: Cross-pollinated capabilities must also pass the 72-hour stability
|
|
14
|
+
window before the target child considers them stable.
|
|
15
|
+
ADR D213: Cross-pollination draws from the same child_learned_behaviors data
|
|
16
|
+
as the absorption engine but targets sibling children instead of the
|
|
17
|
+
parent genome.
|
|
18
|
+
|
|
19
|
+
Pipeline:
|
|
20
|
+
1. find_candidates() -- discover shareable capabilities
|
|
21
|
+
2. propose_pollination() -- create a HITL proposal
|
|
22
|
+
3. approve_pollination() -- HITL approves the proposal
|
|
23
|
+
4. execute_pollination() -- add capability to target children
|
|
24
|
+
5. get_proposals() -- query proposal status
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
python tools/registry/cross_pollinator.py --find-candidates --json
|
|
28
|
+
python tools/registry/cross_pollinator.py --find-candidates \
|
|
29
|
+
--source-child-id "child-abc123" --json
|
|
30
|
+
|
|
31
|
+
python tools/registry/cross_pollinator.py --propose \
|
|
32
|
+
--source-child-id "child-abc123" \
|
|
33
|
+
--capability-name "stig_cache_optimization" \
|
|
34
|
+
--target-child-ids "child-def456,child-ghi789" \
|
|
35
|
+
--proposed-by "architect@mil" --json
|
|
36
|
+
|
|
37
|
+
python tools/registry/cross_pollinator.py --approve \
|
|
38
|
+
--proposal-id "xp-abc12345" --approver "isso@mil" --json
|
|
39
|
+
|
|
40
|
+
python tools/registry/cross_pollinator.py --execute \
|
|
41
|
+
--proposal-id "xp-abc12345" --json
|
|
42
|
+
|
|
43
|
+
python tools/registry/cross_pollinator.py --list-proposals --json
|
|
44
|
+
python tools/registry/cross_pollinator.py --list-proposals --status proposed --json
|
|
45
|
+
"""
|
|
46
|
+
|
|
47
|
+
import argparse
|
|
48
|
+
import hashlib
|
|
49
|
+
import json
|
|
50
|
+
import os
|
|
51
|
+
import sqlite3
|
|
52
|
+
import sys
|
|
53
|
+
import uuid
|
|
54
|
+
from datetime import datetime, timezone
|
|
55
|
+
from pathlib import Path
|
|
56
|
+
from typing import Optional
|
|
57
|
+
from icdev._paths import get_project_root
|
|
58
|
+
|
|
59
|
+
# =========================================================================
|
|
60
|
+
# PATH SETUP
|
|
61
|
+
# =========================================================================
|
|
62
|
+
BASE_DIR = get_project_root()
|
|
63
|
+
if str(BASE_DIR) not in sys.path:
|
|
64
|
+
sys.path.insert(0, str(BASE_DIR))
|
|
65
|
+
|
|
66
|
+
DB_PATH = Path(os.environ.get("ICDEV_DB_PATH", str(BASE_DIR / "data" / "icdev.db")))
|
|
67
|
+
|
|
68
|
+
# =========================================================================
|
|
69
|
+
# GRACEFUL IMPORTS
|
|
70
|
+
# =========================================================================
|
|
71
|
+
try:
|
|
72
|
+
from icdev.tools.audit.audit_logger import log_event as audit_log_event
|
|
73
|
+
_HAS_AUDIT = True
|
|
74
|
+
except ImportError:
|
|
75
|
+
_HAS_AUDIT = False
|
|
76
|
+
|
|
77
|
+
def audit_log_event(**kwargs):
|
|
78
|
+
return -1
|
|
79
|
+
|
|
80
|
+
try:
|
|
81
|
+
from icdev.tools.registry.child_registry import ChildRegistry
|
|
82
|
+
_HAS_REGISTRY = True
|
|
83
|
+
except ImportError:
|
|
84
|
+
_HAS_REGISTRY = False
|
|
85
|
+
|
|
86
|
+
try:
|
|
87
|
+
from icdev.tools.security.prompt_injection_detector import PromptInjectionDetector
|
|
88
|
+
_pid = PromptInjectionDetector()
|
|
89
|
+
except Exception:
|
|
90
|
+
_pid = None
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# =========================================================================
|
|
94
|
+
# CONSTANTS
|
|
95
|
+
# =========================================================================
|
|
96
|
+
CROSS_POLLINATION_PROPOSALS_DDL = """
|
|
97
|
+
CREATE TABLE IF NOT EXISTS cross_pollination_proposals (
|
|
98
|
+
id TEXT PRIMARY KEY,
|
|
99
|
+
source_child_id TEXT NOT NULL,
|
|
100
|
+
capability_name TEXT NOT NULL,
|
|
101
|
+
target_child_ids TEXT NOT NULL,
|
|
102
|
+
proposed_by TEXT NOT NULL DEFAULT 'system',
|
|
103
|
+
approver TEXT,
|
|
104
|
+
status TEXT NOT NULL DEFAULT 'proposed'
|
|
105
|
+
CHECK(status IN ('proposed', 'approved', 'rejected',
|
|
106
|
+
'executing', 'completed', 'failed',
|
|
107
|
+
'cancelled')),
|
|
108
|
+
compatibility_scores_json TEXT DEFAULT '{}',
|
|
109
|
+
rationale TEXT,
|
|
110
|
+
rejection_reason TEXT,
|
|
111
|
+
proposed_at TEXT NOT NULL,
|
|
112
|
+
approved_at TEXT,
|
|
113
|
+
executed_at TEXT,
|
|
114
|
+
classification TEXT DEFAULT 'CUI'
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
CREATE INDEX IF NOT EXISTS idx_xpoll_source
|
|
118
|
+
ON cross_pollination_proposals(source_child_id);
|
|
119
|
+
CREATE INDEX IF NOT EXISTS idx_xpoll_status
|
|
120
|
+
ON cross_pollination_proposals(status);
|
|
121
|
+
CREATE INDEX IF NOT EXISTS idx_xpoll_proposed_at
|
|
122
|
+
ON cross_pollination_proposals(proposed_at);
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
VALID_PROPOSAL_STATUSES = (
|
|
126
|
+
"proposed", "approved", "rejected",
|
|
127
|
+
"executing", "completed", "failed", "cancelled",
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
# =========================================================================
|
|
132
|
+
# HELPERS
|
|
133
|
+
# =========================================================================
|
|
134
|
+
def _now():
|
|
135
|
+
"""ISO-8601 UTC timestamp."""
|
|
136
|
+
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
def _generate_id(prefix="xp"):
|
|
140
|
+
"""Generate a unique ID with prefix."""
|
|
141
|
+
return f"{prefix}-{uuid.uuid4().hex[:8]}"
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def _audit(event_type, action, details=None):
|
|
145
|
+
"""Write audit trail entry (append-only, D6)."""
|
|
146
|
+
if _HAS_AUDIT:
|
|
147
|
+
try:
|
|
148
|
+
audit_log_event(
|
|
149
|
+
event_type=event_type,
|
|
150
|
+
actor="cross-pollinator",
|
|
151
|
+
action=action,
|
|
152
|
+
details=json.dumps(details) if details else None,
|
|
153
|
+
project_id="icdev-genome",
|
|
154
|
+
)
|
|
155
|
+
except Exception:
|
|
156
|
+
pass
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
# =========================================================================
|
|
160
|
+
# CROSS POLLINATOR
|
|
161
|
+
# =========================================================================
|
|
162
|
+
class CrossPollinator:
|
|
163
|
+
"""Brokers capability sharing between child applications.
|
|
164
|
+
|
|
165
|
+
Capabilities proven in one child can be proposed for adoption by sibling
|
|
166
|
+
children. All cross-pollination requires human-in-the-loop (HITL) approval
|
|
167
|
+
per REQ-36-040.
|
|
168
|
+
|
|
169
|
+
The cross-pollination pipeline:
|
|
170
|
+
1. find_candidates() -- discover shareable capabilities
|
|
171
|
+
2. propose_pollination() -- create a proposal (status='proposed')
|
|
172
|
+
3. approve_pollination() -- HITL approval (status='approved')
|
|
173
|
+
4. execute_pollination() -- propagate to targets (status='completed')
|
|
174
|
+
5. get_proposals() -- query proposals by status
|
|
175
|
+
"""
|
|
176
|
+
|
|
177
|
+
def __init__(self, db_path=None):
|
|
178
|
+
"""Initialize CrossPollinator.
|
|
179
|
+
|
|
180
|
+
Args:
|
|
181
|
+
db_path: Path to SQLite database. Defaults to data/icdev.db.
|
|
182
|
+
"""
|
|
183
|
+
self.db_path = Path(db_path) if db_path else DB_PATH
|
|
184
|
+
self._ensure_tables()
|
|
185
|
+
|
|
186
|
+
def _get_conn(self):
|
|
187
|
+
"""Get a database connection with row factory."""
|
|
188
|
+
conn = sqlite3.connect(str(self.db_path))
|
|
189
|
+
conn.row_factory = sqlite3.Row
|
|
190
|
+
conn.execute("PRAGMA journal_mode=WAL")
|
|
191
|
+
conn.execute("PRAGMA foreign_keys=ON")
|
|
192
|
+
return conn
|
|
193
|
+
|
|
194
|
+
def _ensure_tables(self):
|
|
195
|
+
"""Ensure required tables exist."""
|
|
196
|
+
ddl = CROSS_POLLINATION_PROPOSALS_DDL + """
|
|
197
|
+
CREATE TABLE IF NOT EXISTS child_learned_behaviors (
|
|
198
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
199
|
+
child_id TEXT NOT NULL,
|
|
200
|
+
behavior_type TEXT NOT NULL
|
|
201
|
+
CHECK(behavior_type IN ('optimization', 'error_recovery',
|
|
202
|
+
'compliance_shortcut', 'performance_tuning',
|
|
203
|
+
'security_pattern', 'workflow_improvement',
|
|
204
|
+
'configuration', 'other')),
|
|
205
|
+
description TEXT NOT NULL,
|
|
206
|
+
evidence_json TEXT DEFAULT '{}',
|
|
207
|
+
confidence REAL DEFAULT 0.0 CHECK(confidence >= 0.0 AND confidence <= 1.0),
|
|
208
|
+
evaluated INTEGER DEFAULT 0,
|
|
209
|
+
absorbed INTEGER DEFAULT 0,
|
|
210
|
+
discovered_at TEXT DEFAULT (datetime('now')),
|
|
211
|
+
evaluated_at TEXT,
|
|
212
|
+
absorbed_at TEXT,
|
|
213
|
+
classification TEXT DEFAULT 'CUI'
|
|
214
|
+
);
|
|
215
|
+
|
|
216
|
+
CREATE TABLE IF NOT EXISTS child_app_registry (
|
|
217
|
+
id TEXT PRIMARY KEY,
|
|
218
|
+
parent_project_id TEXT,
|
|
219
|
+
child_name TEXT,
|
|
220
|
+
child_type TEXT DEFAULT 'microservice',
|
|
221
|
+
project_path TEXT,
|
|
222
|
+
target_cloud TEXT DEFAULT 'aws',
|
|
223
|
+
compliance_required INTEGER DEFAULT 1,
|
|
224
|
+
blueprint_json TEXT DEFAULT '{}',
|
|
225
|
+
status TEXT DEFAULT 'registered',
|
|
226
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
227
|
+
updated_at TEXT DEFAULT (datetime('now'))
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
CREATE TABLE IF NOT EXISTS child_capabilities (
|
|
231
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
232
|
+
child_id TEXT NOT NULL,
|
|
233
|
+
capability_name TEXT NOT NULL,
|
|
234
|
+
version TEXT DEFAULT '1.0.0',
|
|
235
|
+
status TEXT DEFAULT 'active',
|
|
236
|
+
source TEXT DEFAULT 'parent',
|
|
237
|
+
learned_at TEXT DEFAULT (datetime('now')),
|
|
238
|
+
metadata TEXT DEFAULT '{}',
|
|
239
|
+
created_at TEXT DEFAULT (datetime('now')),
|
|
240
|
+
updated_at TEXT DEFAULT (datetime('now')),
|
|
241
|
+
UNIQUE(child_id, capability_name)
|
|
242
|
+
);
|
|
243
|
+
|
|
244
|
+
CREATE TABLE IF NOT EXISTS propagation_log (
|
|
245
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
246
|
+
capability_name TEXT NOT NULL,
|
|
247
|
+
genome_version TEXT NOT NULL,
|
|
248
|
+
source_type TEXT NOT NULL,
|
|
249
|
+
source_child_id TEXT,
|
|
250
|
+
target_child_id TEXT NOT NULL,
|
|
251
|
+
propagation_status TEXT DEFAULT 'pending',
|
|
252
|
+
evaluation_id INTEGER,
|
|
253
|
+
staging_env_id TEXT,
|
|
254
|
+
error_details TEXT,
|
|
255
|
+
initiated_by TEXT DEFAULT 'evolution-engine',
|
|
256
|
+
initiated_at TEXT DEFAULT (datetime('now')),
|
|
257
|
+
completed_at TEXT,
|
|
258
|
+
classification TEXT DEFAULT 'CUI'
|
|
259
|
+
);
|
|
260
|
+
"""
|
|
261
|
+
try:
|
|
262
|
+
conn = self._get_conn()
|
|
263
|
+
conn.executescript(ddl)
|
|
264
|
+
conn.commit()
|
|
265
|
+
conn.close()
|
|
266
|
+
except Exception as e:
|
|
267
|
+
print(f"Warning: Table creation failed: {e}", file=sys.stderr)
|
|
268
|
+
|
|
269
|
+
def _log_audit_event(self, conn, child_id, event_type, details):
|
|
270
|
+
"""Log an audit event for injection detection (append-only, D6)."""
|
|
271
|
+
_audit(
|
|
272
|
+
f"cross_pollination.{event_type}",
|
|
273
|
+
f"Child {child_id}: {details}",
|
|
274
|
+
{"child_id": child_id, "event_type": event_type, "details": details},
|
|
275
|
+
)
|
|
276
|
+
|
|
277
|
+
def find_candidates(self, source_child_id: str = None) -> list:
|
|
278
|
+
"""Find capabilities from children that could benefit siblings.
|
|
279
|
+
|
|
280
|
+
Scans child_learned_behaviors for evaluated behaviors with high
|
|
281
|
+
confidence, then identifies sibling children that do not already
|
|
282
|
+
have those capabilities.
|
|
283
|
+
|
|
284
|
+
Args:
|
|
285
|
+
source_child_id: Optional filter to only consider capabilities
|
|
286
|
+
from a specific child. If None, considers all children.
|
|
287
|
+
|
|
288
|
+
Returns:
|
|
289
|
+
List of candidate dicts, each containing:
|
|
290
|
+
source_child (str): Child ID that discovered the capability
|
|
291
|
+
capability (dict): Behavior details
|
|
292
|
+
candidate_targets (list): Sibling child IDs that could benefit
|
|
293
|
+
compatibility_score (float): Estimated compatibility (0.0-1.0)
|
|
294
|
+
"""
|
|
295
|
+
conn = self._get_conn()
|
|
296
|
+
try:
|
|
297
|
+
# Find evaluated behaviors with reasonable confidence
|
|
298
|
+
query = """
|
|
299
|
+
SELECT id, child_id, behavior_type, description,
|
|
300
|
+
evidence_json, confidence, absorbed
|
|
301
|
+
FROM child_learned_behaviors
|
|
302
|
+
WHERE evaluated = 1
|
|
303
|
+
AND confidence >= 0.5
|
|
304
|
+
"""
|
|
305
|
+
params = []
|
|
306
|
+
|
|
307
|
+
if source_child_id:
|
|
308
|
+
query += " AND child_id = ?"
|
|
309
|
+
params.append(source_child_id)
|
|
310
|
+
|
|
311
|
+
query += " ORDER BY confidence DESC"
|
|
312
|
+
|
|
313
|
+
behaviors = conn.execute(query, params).fetchall()
|
|
314
|
+
|
|
315
|
+
if not behaviors:
|
|
316
|
+
return []
|
|
317
|
+
|
|
318
|
+
# Get all active children
|
|
319
|
+
children = conn.execute(
|
|
320
|
+
"""SELECT id, child_name, child_type, compliance_required
|
|
321
|
+
FROM child_app_registry
|
|
322
|
+
WHERE status = 'active'"""
|
|
323
|
+
).fetchall()
|
|
324
|
+
|
|
325
|
+
child_map = {row["id"]: dict(row) for row in children}
|
|
326
|
+
|
|
327
|
+
# For each behavior, find sibling targets that don't have it
|
|
328
|
+
candidates = []
|
|
329
|
+
for beh in behaviors:
|
|
330
|
+
beh_dict = dict(beh)
|
|
331
|
+
source_cid = beh_dict["child_id"]
|
|
332
|
+
|
|
333
|
+
# Parse evidence
|
|
334
|
+
try:
|
|
335
|
+
evidence = json.loads(beh_dict.get("evidence_json", "{}"))
|
|
336
|
+
except (json.JSONDecodeError, TypeError):
|
|
337
|
+
evidence = {}
|
|
338
|
+
|
|
339
|
+
# Phase 37 integration: scan evidence for injection
|
|
340
|
+
if _pid is not None and evidence:
|
|
341
|
+
evidence_text = json.dumps(evidence) if isinstance(evidence, dict) else str(evidence)
|
|
342
|
+
scan_result = _pid.scan_text(evidence_text, source="cross_pollination_candidate")
|
|
343
|
+
if scan_result.get("detected") and scan_result.get("confidence", 0) >= 0.7:
|
|
344
|
+
# Skip this candidate -- injection detected
|
|
345
|
+
self._log_audit_event(
|
|
346
|
+
conn, beh_dict.get("child_id", "unknown"),
|
|
347
|
+
"cross_pollination_rejected",
|
|
348
|
+
f"Injection in evidence (confidence={scan_result['confidence']:.2f})"
|
|
349
|
+
)
|
|
350
|
+
continue
|
|
351
|
+
|
|
352
|
+
# Find siblings without this capability
|
|
353
|
+
existing_caps = conn.execute(
|
|
354
|
+
"""SELECT DISTINCT child_id
|
|
355
|
+
FROM child_capabilities
|
|
356
|
+
WHERE capability_name = ?
|
|
357
|
+
AND status = 'active'""",
|
|
358
|
+
(beh_dict["description"][:200],),
|
|
359
|
+
).fetchall()
|
|
360
|
+
|
|
361
|
+
children_with_cap = {row["child_id"] for row in existing_caps}
|
|
362
|
+
children_with_cap.add(source_cid) # Source already has it
|
|
363
|
+
|
|
364
|
+
target_ids = []
|
|
365
|
+
for cid in child_map:
|
|
366
|
+
if cid not in children_with_cap:
|
|
367
|
+
target_ids.append(cid)
|
|
368
|
+
|
|
369
|
+
if not target_ids:
|
|
370
|
+
continue
|
|
371
|
+
|
|
372
|
+
# Compute compatibility score
|
|
373
|
+
compatibility = self._compute_compatibility(
|
|
374
|
+
beh_dict, child_map, target_ids
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
candidates.append({
|
|
378
|
+
"source_child": source_cid,
|
|
379
|
+
"behavior_id": beh_dict["id"],
|
|
380
|
+
"capability": {
|
|
381
|
+
"behavior_type": beh_dict["behavior_type"],
|
|
382
|
+
"description": beh_dict["description"],
|
|
383
|
+
"confidence": beh_dict["confidence"],
|
|
384
|
+
"absorbed": bool(beh_dict.get("absorbed", 0)),
|
|
385
|
+
},
|
|
386
|
+
"candidate_targets": target_ids,
|
|
387
|
+
"target_count": len(target_ids),
|
|
388
|
+
"compatibility_score": compatibility,
|
|
389
|
+
})
|
|
390
|
+
|
|
391
|
+
# Sort by compatibility score descending
|
|
392
|
+
candidates.sort(key=lambda c: c["compatibility_score"], reverse=True)
|
|
393
|
+
|
|
394
|
+
return candidates
|
|
395
|
+
|
|
396
|
+
finally:
|
|
397
|
+
conn.close()
|
|
398
|
+
|
|
399
|
+
def _compute_compatibility(
|
|
400
|
+
self, behavior: dict, child_map: dict, target_ids: list
|
|
401
|
+
) -> float:
|
|
402
|
+
"""Compute compatibility score for cross-pollination.
|
|
403
|
+
|
|
404
|
+
Considers behavior confidence, number of potential targets, and
|
|
405
|
+
whether targets share compliance requirements with the source.
|
|
406
|
+
|
|
407
|
+
Args:
|
|
408
|
+
behavior: Behavior record dict.
|
|
409
|
+
child_map: Dict of child_id -> child record.
|
|
410
|
+
target_ids: List of target child IDs.
|
|
411
|
+
|
|
412
|
+
Returns:
|
|
413
|
+
Compatibility score between 0.0 and 1.0.
|
|
414
|
+
"""
|
|
415
|
+
confidence = behavior.get("confidence", 0.5)
|
|
416
|
+
source_cid = behavior.get("child_id", "")
|
|
417
|
+
source_child = child_map.get(source_cid, {})
|
|
418
|
+
source_compliance = source_child.get("compliance_required", 1)
|
|
419
|
+
source_type = source_child.get("child_type", "")
|
|
420
|
+
|
|
421
|
+
# Base score from confidence
|
|
422
|
+
score = confidence * 0.50
|
|
423
|
+
|
|
424
|
+
# Target coverage: more targets = more universal
|
|
425
|
+
total_children = len(child_map)
|
|
426
|
+
if total_children > 0:
|
|
427
|
+
coverage = len(target_ids) / total_children
|
|
428
|
+
score += coverage * 0.20
|
|
429
|
+
|
|
430
|
+
# Compliance compatibility: if source requires compliance and targets
|
|
431
|
+
# also require it, the behavior is more likely compatible
|
|
432
|
+
compatible_count = 0
|
|
433
|
+
for tid in target_ids:
|
|
434
|
+
target = child_map.get(tid, {})
|
|
435
|
+
if target.get("compliance_required", 1) == source_compliance:
|
|
436
|
+
compatible_count += 1
|
|
437
|
+
if target.get("child_type", "") == source_type:
|
|
438
|
+
compatible_count += 1
|
|
439
|
+
|
|
440
|
+
if target_ids:
|
|
441
|
+
compat_ratio = compatible_count / (len(target_ids) * 2)
|
|
442
|
+
score += compat_ratio * 0.20
|
|
443
|
+
|
|
444
|
+
# Behavior type bonus: security and compliance behaviors are more universally useful
|
|
445
|
+
btype = behavior.get("behavior_type", "other")
|
|
446
|
+
universal_types = ("security_pattern", "compliance_shortcut", "error_recovery")
|
|
447
|
+
if btype in universal_types:
|
|
448
|
+
score += 0.10
|
|
449
|
+
|
|
450
|
+
return round(min(score, 1.0), 4)
|
|
451
|
+
|
|
452
|
+
def propose_pollination(
|
|
453
|
+
self,
|
|
454
|
+
source_child_id: str,
|
|
455
|
+
capability_name: str,
|
|
456
|
+
target_child_ids: list,
|
|
457
|
+
proposed_by: str = "system",
|
|
458
|
+
rationale: str = None,
|
|
459
|
+
) -> Optional[dict]:
|
|
460
|
+
"""Create a cross-pollination proposal.
|
|
461
|
+
|
|
462
|
+
Records the proposal in cross_pollination_proposals and propagation_log
|
|
463
|
+
with status='proposed'. Requires HITL approval before execution.
|
|
464
|
+
|
|
465
|
+
Args:
|
|
466
|
+
source_child_id: Child ID that discovered the capability.
|
|
467
|
+
capability_name: Name/description of the capability to share.
|
|
468
|
+
target_child_ids: List of sibling child IDs to receive the capability.
|
|
469
|
+
proposed_by: Identity of the person/system creating the proposal.
|
|
470
|
+
rationale: Optional human-readable rationale for the proposal.
|
|
471
|
+
|
|
472
|
+
Returns:
|
|
473
|
+
Dict with proposal details, or None on failure.
|
|
474
|
+
"""
|
|
475
|
+
if not target_child_ids:
|
|
476
|
+
return {"error": "No target children specified"}
|
|
477
|
+
|
|
478
|
+
proposal_id = _generate_id("xp")
|
|
479
|
+
now = _now()
|
|
480
|
+
|
|
481
|
+
conn = self._get_conn()
|
|
482
|
+
try:
|
|
483
|
+
# Compute compatibility scores for each target
|
|
484
|
+
compatibility_scores = {}
|
|
485
|
+
for tid in target_child_ids:
|
|
486
|
+
# Simple compatibility check: verify target exists
|
|
487
|
+
target = conn.execute(
|
|
488
|
+
"SELECT id, child_name FROM child_app_registry WHERE id = ?",
|
|
489
|
+
(tid,),
|
|
490
|
+
).fetchone()
|
|
491
|
+
if target:
|
|
492
|
+
compatibility_scores[tid] = {
|
|
493
|
+
"child_name": target["child_name"],
|
|
494
|
+
"status": "pending_approval",
|
|
495
|
+
}
|
|
496
|
+
else:
|
|
497
|
+
compatibility_scores[tid] = {
|
|
498
|
+
"child_name": "unknown",
|
|
499
|
+
"status": "target_not_found",
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
# Insert proposal (append-only)
|
|
503
|
+
conn.execute(
|
|
504
|
+
"""INSERT INTO cross_pollination_proposals
|
|
505
|
+
(id, source_child_id, capability_name, target_child_ids,
|
|
506
|
+
proposed_by, status, compatibility_scores_json,
|
|
507
|
+
rationale, proposed_at, classification)
|
|
508
|
+
VALUES (?, ?, ?, ?, ?, 'proposed', ?, ?, ?, 'CUI')""",
|
|
509
|
+
(
|
|
510
|
+
proposal_id,
|
|
511
|
+
source_child_id,
|
|
512
|
+
capability_name,
|
|
513
|
+
json.dumps(target_child_ids),
|
|
514
|
+
proposed_by,
|
|
515
|
+
json.dumps(compatibility_scores),
|
|
516
|
+
rationale,
|
|
517
|
+
now,
|
|
518
|
+
),
|
|
519
|
+
)
|
|
520
|
+
|
|
521
|
+
# Record in propagation_log for each target (append-only, D6)
|
|
522
|
+
for tid in target_child_ids:
|
|
523
|
+
conn.execute(
|
|
524
|
+
"""INSERT INTO propagation_log
|
|
525
|
+
(capability_name, genome_version, source_type,
|
|
526
|
+
source_child_id, target_child_id,
|
|
527
|
+
propagation_status, initiated_by,
|
|
528
|
+
initiated_at, classification)
|
|
529
|
+
VALUES (?, 'cross_pollination', 'child_learned', ?, ?,
|
|
530
|
+
'pending', ?, ?, 'CUI')""",
|
|
531
|
+
(
|
|
532
|
+
capability_name,
|
|
533
|
+
source_child_id,
|
|
534
|
+
tid,
|
|
535
|
+
proposed_by,
|
|
536
|
+
now,
|
|
537
|
+
),
|
|
538
|
+
)
|
|
539
|
+
|
|
540
|
+
conn.commit()
|
|
541
|
+
|
|
542
|
+
result = {
|
|
543
|
+
"proposal_id": proposal_id,
|
|
544
|
+
"source_child_id": source_child_id,
|
|
545
|
+
"capability_name": capability_name,
|
|
546
|
+
"target_child_ids": target_child_ids,
|
|
547
|
+
"target_count": len(target_child_ids),
|
|
548
|
+
"proposed_by": proposed_by,
|
|
549
|
+
"status": "proposed",
|
|
550
|
+
"rationale": rationale,
|
|
551
|
+
"proposed_at": now,
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
_audit(
|
|
555
|
+
"cross_pollination.proposed",
|
|
556
|
+
f"Cross-pollination proposed: '{capability_name}' from "
|
|
557
|
+
f"{source_child_id} to {len(target_child_ids)} targets",
|
|
558
|
+
result,
|
|
559
|
+
)
|
|
560
|
+
|
|
561
|
+
return result
|
|
562
|
+
|
|
563
|
+
except Exception as e:
|
|
564
|
+
return {"error": str(e)}
|
|
565
|
+
finally:
|
|
566
|
+
conn.close()
|
|
567
|
+
|
|
568
|
+
def approve_pollination(self, proposal_id: str, approver: str) -> bool:
|
|
569
|
+
"""Approve a cross-pollination proposal (HITL gate, REQ-36-040).
|
|
570
|
+
|
|
571
|
+
Only proposals in 'proposed' status can be approved.
|
|
572
|
+
|
|
573
|
+
Args:
|
|
574
|
+
proposal_id: Proposal ID to approve.
|
|
575
|
+
approver: Identity of the human approver.
|
|
576
|
+
|
|
577
|
+
Returns:
|
|
578
|
+
True if approval succeeded, False otherwise.
|
|
579
|
+
"""
|
|
580
|
+
now = _now()
|
|
581
|
+
conn = self._get_conn()
|
|
582
|
+
try:
|
|
583
|
+
# Verify proposal exists and is in 'proposed' status
|
|
584
|
+
row = conn.execute(
|
|
585
|
+
"SELECT * FROM cross_pollination_proposals WHERE id = ?",
|
|
586
|
+
(proposal_id,),
|
|
587
|
+
).fetchone()
|
|
588
|
+
|
|
589
|
+
if not row:
|
|
590
|
+
print(
|
|
591
|
+
f"Warning: Proposal {proposal_id} not found",
|
|
592
|
+
file=sys.stderr,
|
|
593
|
+
)
|
|
594
|
+
return False
|
|
595
|
+
|
|
596
|
+
proposal = dict(row)
|
|
597
|
+
if proposal["status"] != "proposed":
|
|
598
|
+
print(
|
|
599
|
+
f"Warning: Proposal {proposal_id} is in status "
|
|
600
|
+
f"'{proposal['status']}', cannot approve",
|
|
601
|
+
file=sys.stderr,
|
|
602
|
+
)
|
|
603
|
+
return False
|
|
604
|
+
|
|
605
|
+
# Update status to approved
|
|
606
|
+
conn.execute(
|
|
607
|
+
"""UPDATE cross_pollination_proposals
|
|
608
|
+
SET status = 'approved', approver = ?, approved_at = ?
|
|
609
|
+
WHERE id = ?""",
|
|
610
|
+
(approver, now, proposal_id),
|
|
611
|
+
)
|
|
612
|
+
conn.commit()
|
|
613
|
+
|
|
614
|
+
_audit(
|
|
615
|
+
"cross_pollination.approved",
|
|
616
|
+
f"Cross-pollination {proposal_id} approved by {approver}",
|
|
617
|
+
{
|
|
618
|
+
"proposal_id": proposal_id,
|
|
619
|
+
"approver": approver,
|
|
620
|
+
"capability_name": proposal.get("capability_name", ""),
|
|
621
|
+
"approved_at": now,
|
|
622
|
+
},
|
|
623
|
+
)
|
|
624
|
+
|
|
625
|
+
return True
|
|
626
|
+
|
|
627
|
+
except Exception as e:
|
|
628
|
+
print(f"Warning: Approval failed: {e}", file=sys.stderr)
|
|
629
|
+
return False
|
|
630
|
+
finally:
|
|
631
|
+
conn.close()
|
|
632
|
+
|
|
633
|
+
def execute_pollination(self, proposal_id: str) -> dict:
|
|
634
|
+
"""Execute an approved cross-pollination proposal.
|
|
635
|
+
|
|
636
|
+
Adds the capability to each target child via child_capabilities table
|
|
637
|
+
(or ChildRegistry if available). The proposal must be in 'approved'
|
|
638
|
+
status.
|
|
639
|
+
|
|
640
|
+
Args:
|
|
641
|
+
proposal_id: Proposal ID to execute.
|
|
642
|
+
|
|
643
|
+
Returns:
|
|
644
|
+
Dict with execution results per target child.
|
|
645
|
+
"""
|
|
646
|
+
conn = self._get_conn()
|
|
647
|
+
try:
|
|
648
|
+
# Fetch proposal
|
|
649
|
+
row = conn.execute(
|
|
650
|
+
"SELECT * FROM cross_pollination_proposals WHERE id = ?",
|
|
651
|
+
(proposal_id,),
|
|
652
|
+
).fetchone()
|
|
653
|
+
|
|
654
|
+
if not row:
|
|
655
|
+
return {"error": f"Proposal {proposal_id} not found"}
|
|
656
|
+
|
|
657
|
+
proposal = dict(row)
|
|
658
|
+
|
|
659
|
+
if proposal["status"] != "approved":
|
|
660
|
+
return {
|
|
661
|
+
"error": (
|
|
662
|
+
f"Proposal {proposal_id} is in status "
|
|
663
|
+
f"'{proposal['status']}'. Must be 'approved' to execute."
|
|
664
|
+
),
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
# Update status to executing
|
|
668
|
+
conn.execute(
|
|
669
|
+
"""UPDATE cross_pollination_proposals
|
|
670
|
+
SET status = 'executing'
|
|
671
|
+
WHERE id = ?""",
|
|
672
|
+
(proposal_id,),
|
|
673
|
+
)
|
|
674
|
+
conn.commit()
|
|
675
|
+
|
|
676
|
+
# Parse target children
|
|
677
|
+
try:
|
|
678
|
+
target_ids = json.loads(proposal.get("target_child_ids", "[]"))
|
|
679
|
+
except (json.JSONDecodeError, TypeError):
|
|
680
|
+
target_ids = []
|
|
681
|
+
|
|
682
|
+
capability_name = proposal.get("capability_name", "")
|
|
683
|
+
source_child_id = proposal.get("source_child_id", "")
|
|
684
|
+
now = _now()
|
|
685
|
+
|
|
686
|
+
# Execute propagation to each target
|
|
687
|
+
results_per_target = {}
|
|
688
|
+
all_success = True
|
|
689
|
+
|
|
690
|
+
for tid in target_ids:
|
|
691
|
+
try:
|
|
692
|
+
if _HAS_REGISTRY:
|
|
693
|
+
# Use ChildRegistry to add capability
|
|
694
|
+
registry = ChildRegistry(db_path=self.db_path)
|
|
695
|
+
registry.add_capability(
|
|
696
|
+
child_id=tid,
|
|
697
|
+
capability_name=capability_name,
|
|
698
|
+
version="1.0.0",
|
|
699
|
+
source="learned",
|
|
700
|
+
metadata={
|
|
701
|
+
"source_child": source_child_id,
|
|
702
|
+
"proposal_id": proposal_id,
|
|
703
|
+
"pollinated_at": now,
|
|
704
|
+
},
|
|
705
|
+
)
|
|
706
|
+
else:
|
|
707
|
+
# Fallback: insert directly into child_capabilities
|
|
708
|
+
conn.execute(
|
|
709
|
+
"""INSERT OR REPLACE INTO child_capabilities
|
|
710
|
+
(child_id, capability_name, version, status,
|
|
711
|
+
source, learned_at, metadata, updated_at)
|
|
712
|
+
VALUES (?, ?, '1.0.0', 'active', 'learned',
|
|
713
|
+
?, ?, ?)""",
|
|
714
|
+
(
|
|
715
|
+
tid,
|
|
716
|
+
capability_name,
|
|
717
|
+
now,
|
|
718
|
+
json.dumps({
|
|
719
|
+
"source_child": source_child_id,
|
|
720
|
+
"proposal_id": proposal_id,
|
|
721
|
+
"pollinated_at": now,
|
|
722
|
+
}),
|
|
723
|
+
now,
|
|
724
|
+
),
|
|
725
|
+
)
|
|
726
|
+
|
|
727
|
+
# Update propagation_log for this target
|
|
728
|
+
conn.execute(
|
|
729
|
+
"""UPDATE propagation_log
|
|
730
|
+
SET propagation_status = 'success', completed_at = ?
|
|
731
|
+
WHERE capability_name = ?
|
|
732
|
+
AND source_child_id = ?
|
|
733
|
+
AND target_child_id = ?
|
|
734
|
+
AND propagation_status = 'pending'""",
|
|
735
|
+
(now, capability_name, source_child_id, tid),
|
|
736
|
+
)
|
|
737
|
+
|
|
738
|
+
results_per_target[tid] = {"status": "success"}
|
|
739
|
+
|
|
740
|
+
except Exception as e:
|
|
741
|
+
results_per_target[tid] = {
|
|
742
|
+
"status": "failed",
|
|
743
|
+
"error": str(e),
|
|
744
|
+
}
|
|
745
|
+
all_success = False
|
|
746
|
+
|
|
747
|
+
# Update propagation_log for failure
|
|
748
|
+
conn.execute(
|
|
749
|
+
"""UPDATE propagation_log
|
|
750
|
+
SET propagation_status = 'failed',
|
|
751
|
+
error_details = ?,
|
|
752
|
+
completed_at = ?
|
|
753
|
+
WHERE capability_name = ?
|
|
754
|
+
AND source_child_id = ?
|
|
755
|
+
AND target_child_id = ?
|
|
756
|
+
AND propagation_status = 'pending'""",
|
|
757
|
+
(str(e), now, capability_name, source_child_id, tid),
|
|
758
|
+
)
|
|
759
|
+
|
|
760
|
+
# Update proposal status
|
|
761
|
+
final_status = "completed" if all_success else "failed"
|
|
762
|
+
conn.execute(
|
|
763
|
+
"""UPDATE cross_pollination_proposals
|
|
764
|
+
SET status = ?, executed_at = ?
|
|
765
|
+
WHERE id = ?""",
|
|
766
|
+
(final_status, now, proposal_id),
|
|
767
|
+
)
|
|
768
|
+
conn.commit()
|
|
769
|
+
|
|
770
|
+
result = {
|
|
771
|
+
"proposal_id": proposal_id,
|
|
772
|
+
"capability_name": capability_name,
|
|
773
|
+
"source_child_id": source_child_id,
|
|
774
|
+
"status": final_status,
|
|
775
|
+
"results": results_per_target,
|
|
776
|
+
"targets_succeeded": sum(
|
|
777
|
+
1 for r in results_per_target.values()
|
|
778
|
+
if r["status"] == "success"
|
|
779
|
+
),
|
|
780
|
+
"targets_failed": sum(
|
|
781
|
+
1 for r in results_per_target.values()
|
|
782
|
+
if r["status"] == "failed"
|
|
783
|
+
),
|
|
784
|
+
"executed_at": now,
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
_audit(
|
|
788
|
+
"cross_pollination.executed",
|
|
789
|
+
f"Cross-pollination {proposal_id} {final_status}: "
|
|
790
|
+
f"{result['targets_succeeded']}/{len(target_ids)} targets succeeded",
|
|
791
|
+
result,
|
|
792
|
+
)
|
|
793
|
+
|
|
794
|
+
return result
|
|
795
|
+
|
|
796
|
+
except Exception as e:
|
|
797
|
+
return {"error": str(e)}
|
|
798
|
+
finally:
|
|
799
|
+
conn.close()
|
|
800
|
+
|
|
801
|
+
def get_proposals(self, status: str = None) -> list:
|
|
802
|
+
"""List cross-pollination proposals, optionally filtered by status.
|
|
803
|
+
|
|
804
|
+
Args:
|
|
805
|
+
status: Optional status filter. Must be one of VALID_PROPOSAL_STATUSES.
|
|
806
|
+
|
|
807
|
+
Returns:
|
|
808
|
+
List of proposal dicts ordered by proposed_at descending.
|
|
809
|
+
"""
|
|
810
|
+
conn = self._get_conn()
|
|
811
|
+
try:
|
|
812
|
+
query = """
|
|
813
|
+
SELECT id, source_child_id, capability_name, target_child_ids,
|
|
814
|
+
proposed_by, approver, status, rationale,
|
|
815
|
+
rejection_reason, proposed_at, approved_at, executed_at
|
|
816
|
+
FROM cross_pollination_proposals
|
|
817
|
+
"""
|
|
818
|
+
params = []
|
|
819
|
+
|
|
820
|
+
if status:
|
|
821
|
+
if status not in VALID_PROPOSAL_STATUSES:
|
|
822
|
+
return [{"error": f"Invalid status '{status}'. Must be one of: "
|
|
823
|
+
f"{', '.join(VALID_PROPOSAL_STATUSES)}"}]
|
|
824
|
+
query += " WHERE status = ?"
|
|
825
|
+
params.append(status)
|
|
826
|
+
|
|
827
|
+
query += " ORDER BY proposed_at DESC"
|
|
828
|
+
|
|
829
|
+
rows = conn.execute(query, params).fetchall()
|
|
830
|
+
|
|
831
|
+
results = []
|
|
832
|
+
for row in rows:
|
|
833
|
+
record = dict(row)
|
|
834
|
+
# Parse target_child_ids from JSON
|
|
835
|
+
try:
|
|
836
|
+
record["target_child_ids"] = json.loads(
|
|
837
|
+
record.get("target_child_ids", "[]")
|
|
838
|
+
)
|
|
839
|
+
except (json.JSONDecodeError, TypeError):
|
|
840
|
+
record["target_child_ids"] = []
|
|
841
|
+
record["target_count"] = len(record["target_child_ids"])
|
|
842
|
+
results.append(record)
|
|
843
|
+
|
|
844
|
+
return results
|
|
845
|
+
|
|
846
|
+
finally:
|
|
847
|
+
conn.close()
|
|
848
|
+
|
|
849
|
+
|
|
850
|
+
# =========================================================================
|
|
851
|
+
# CLI
|
|
852
|
+
# =========================================================================
|
|
853
|
+
def main():
|
|
854
|
+
parser = argparse.ArgumentParser(
|
|
855
|
+
description=(
|
|
856
|
+
"ICDEV Cross-Pollinator -- broker capability sharing "
|
|
857
|
+
"between child applications (REQ-36-040, HITL required)"
|
|
858
|
+
)
|
|
859
|
+
)
|
|
860
|
+
parser.add_argument("--json", action="store_true", help="JSON output")
|
|
861
|
+
parser.add_argument(
|
|
862
|
+
"--db-path", type=Path, default=None, help="Database path override"
|
|
863
|
+
)
|
|
864
|
+
|
|
865
|
+
group = parser.add_mutually_exclusive_group(required=True)
|
|
866
|
+
group.add_argument(
|
|
867
|
+
"--find-candidates", action="store_true",
|
|
868
|
+
help="Find capabilities suitable for cross-pollination",
|
|
869
|
+
)
|
|
870
|
+
group.add_argument(
|
|
871
|
+
"--propose", action="store_true",
|
|
872
|
+
help="Create a cross-pollination proposal",
|
|
873
|
+
)
|
|
874
|
+
group.add_argument(
|
|
875
|
+
"--approve", action="store_true",
|
|
876
|
+
help="Approve a cross-pollination proposal (HITL)",
|
|
877
|
+
)
|
|
878
|
+
group.add_argument(
|
|
879
|
+
"--execute", action="store_true",
|
|
880
|
+
help="Execute an approved cross-pollination",
|
|
881
|
+
)
|
|
882
|
+
group.add_argument(
|
|
883
|
+
"--list-proposals", action="store_true",
|
|
884
|
+
help="List cross-pollination proposals",
|
|
885
|
+
)
|
|
886
|
+
|
|
887
|
+
# Candidate search args
|
|
888
|
+
parser.add_argument(
|
|
889
|
+
"--source-child-id",
|
|
890
|
+
help="Source child ID (for --find-candidates, --propose)",
|
|
891
|
+
)
|
|
892
|
+
|
|
893
|
+
# Proposal creation args
|
|
894
|
+
parser.add_argument("--capability-name", help="Capability name (for --propose)")
|
|
895
|
+
parser.add_argument(
|
|
896
|
+
"--target-child-ids",
|
|
897
|
+
help="Comma-separated target child IDs (for --propose)",
|
|
898
|
+
)
|
|
899
|
+
parser.add_argument(
|
|
900
|
+
"--proposed-by", default="system",
|
|
901
|
+
help="Proposer identity (for --propose)",
|
|
902
|
+
)
|
|
903
|
+
parser.add_argument("--rationale", help="Proposal rationale (for --propose)")
|
|
904
|
+
|
|
905
|
+
# Approval/execution args
|
|
906
|
+
parser.add_argument("--proposal-id", help="Proposal ID (for --approve, --execute)")
|
|
907
|
+
parser.add_argument("--approver", help="Approver identity (for --approve)")
|
|
908
|
+
|
|
909
|
+
# Filter args
|
|
910
|
+
parser.add_argument(
|
|
911
|
+
"--status",
|
|
912
|
+
choices=VALID_PROPOSAL_STATUSES,
|
|
913
|
+
help="Filter proposals by status (for --list-proposals)",
|
|
914
|
+
)
|
|
915
|
+
|
|
916
|
+
args = parser.parse_args()
|
|
917
|
+
|
|
918
|
+
try:
|
|
919
|
+
pollinator = CrossPollinator(db_path=args.db_path)
|
|
920
|
+
|
|
921
|
+
if args.find_candidates:
|
|
922
|
+
result = pollinator.find_candidates(
|
|
923
|
+
source_child_id=args.source_child_id
|
|
924
|
+
)
|
|
925
|
+
|
|
926
|
+
elif args.propose:
|
|
927
|
+
if not args.source_child_id:
|
|
928
|
+
parser.error("--propose requires --source-child-id")
|
|
929
|
+
if not args.capability_name:
|
|
930
|
+
parser.error("--propose requires --capability-name")
|
|
931
|
+
if not args.target_child_ids:
|
|
932
|
+
parser.error("--propose requires --target-child-ids")
|
|
933
|
+
|
|
934
|
+
target_ids = [
|
|
935
|
+
tid.strip()
|
|
936
|
+
for tid in args.target_child_ids.split(",")
|
|
937
|
+
if tid.strip()
|
|
938
|
+
]
|
|
939
|
+
|
|
940
|
+
result = pollinator.propose_pollination(
|
|
941
|
+
source_child_id=args.source_child_id,
|
|
942
|
+
capability_name=args.capability_name,
|
|
943
|
+
target_child_ids=target_ids,
|
|
944
|
+
proposed_by=args.proposed_by,
|
|
945
|
+
rationale=args.rationale,
|
|
946
|
+
)
|
|
947
|
+
|
|
948
|
+
elif args.approve:
|
|
949
|
+
if not args.proposal_id:
|
|
950
|
+
parser.error("--approve requires --proposal-id")
|
|
951
|
+
if not args.approver:
|
|
952
|
+
parser.error("--approve requires --approver")
|
|
953
|
+
|
|
954
|
+
success = pollinator.approve_pollination(
|
|
955
|
+
proposal_id=args.proposal_id,
|
|
956
|
+
approver=args.approver,
|
|
957
|
+
)
|
|
958
|
+
result = {
|
|
959
|
+
"proposal_id": args.proposal_id,
|
|
960
|
+
"approved": success,
|
|
961
|
+
"approver": args.approver,
|
|
962
|
+
"approved_at": _now() if success else None,
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
elif args.execute:
|
|
966
|
+
if not args.proposal_id:
|
|
967
|
+
parser.error("--execute requires --proposal-id")
|
|
968
|
+
result = pollinator.execute_pollination(
|
|
969
|
+
proposal_id=args.proposal_id
|
|
970
|
+
)
|
|
971
|
+
|
|
972
|
+
elif args.list_proposals:
|
|
973
|
+
result = pollinator.get_proposals(status=args.status)
|
|
974
|
+
|
|
975
|
+
else:
|
|
976
|
+
result = {"error": "No action specified"}
|
|
977
|
+
|
|
978
|
+
if args.json:
|
|
979
|
+
print(json.dumps(result, indent=2, default=str))
|
|
980
|
+
else:
|
|
981
|
+
# Human-readable output
|
|
982
|
+
if args.find_candidates and isinstance(result, list):
|
|
983
|
+
print("Cross-Pollination Candidates")
|
|
984
|
+
print("=" * 80)
|
|
985
|
+
if not result:
|
|
986
|
+
print(" No candidates found")
|
|
987
|
+
for cand in result:
|
|
988
|
+
cap = cand.get("capability", {})
|
|
989
|
+
print(
|
|
990
|
+
f" Source: {cand.get('source_child', '?'):16s} "
|
|
991
|
+
f"Type: {cap.get('behavior_type', '?'):20s} "
|
|
992
|
+
f"Conf: {cap.get('confidence', 0):.2f} "
|
|
993
|
+
f"Targets: {cand.get('target_count', 0)} "
|
|
994
|
+
f"Compat: {cand.get('compatibility_score', 0):.4f}"
|
|
995
|
+
)
|
|
996
|
+
desc = cap.get("description", "")[:60]
|
|
997
|
+
if desc:
|
|
998
|
+
print(f" {desc}")
|
|
999
|
+
|
|
1000
|
+
elif args.propose and isinstance(result, dict):
|
|
1001
|
+
if "error" in result:
|
|
1002
|
+
print(f"ERROR: {result['error']}", file=sys.stderr)
|
|
1003
|
+
else:
|
|
1004
|
+
print(f"Proposal Created: {result.get('proposal_id')}")
|
|
1005
|
+
print(f" Capability: {result.get('capability_name')}")
|
|
1006
|
+
print(f" Source: {result.get('source_child_id')}")
|
|
1007
|
+
print(f" Targets: {result.get('target_count', 0)}")
|
|
1008
|
+
print(f" Status: {result.get('status')}")
|
|
1009
|
+
print(f" Proposed By: {result.get('proposed_by')}")
|
|
1010
|
+
print(" NOTE: Requires HITL approval before execution")
|
|
1011
|
+
|
|
1012
|
+
elif args.approve and isinstance(result, dict):
|
|
1013
|
+
ok = result.get("approved", False)
|
|
1014
|
+
print(f"Approval: {'APPROVED' if ok else 'FAILED'}")
|
|
1015
|
+
print(f" Proposal: {result.get('proposal_id')}")
|
|
1016
|
+
print(f" Approver: {result.get('approver')}")
|
|
1017
|
+
|
|
1018
|
+
elif args.execute and isinstance(result, dict):
|
|
1019
|
+
if "error" in result:
|
|
1020
|
+
print(f"ERROR: {result['error']}", file=sys.stderr)
|
|
1021
|
+
else:
|
|
1022
|
+
status = result.get("status", "unknown")
|
|
1023
|
+
print(f"Execution: {status.upper()}")
|
|
1024
|
+
print(f" Proposal: {result.get('proposal_id')}")
|
|
1025
|
+
print(f" Capability: {result.get('capability_name')}")
|
|
1026
|
+
print(
|
|
1027
|
+
f" Succeeded: {result.get('targets_succeeded', 0)}"
|
|
1028
|
+
f"/{result.get('targets_succeeded', 0) + result.get('targets_failed', 0)}"
|
|
1029
|
+
)
|
|
1030
|
+
results = result.get("results", {})
|
|
1031
|
+
for tid, tres in results.items():
|
|
1032
|
+
status_str = tres.get("status", "unknown")
|
|
1033
|
+
err = tres.get("error", "")
|
|
1034
|
+
print(f" {tid}: {status_str}" + (f" ({err})" if err else ""))
|
|
1035
|
+
|
|
1036
|
+
elif args.list_proposals and isinstance(result, list):
|
|
1037
|
+
print("Cross-Pollination Proposals")
|
|
1038
|
+
print("=" * 90)
|
|
1039
|
+
if not result:
|
|
1040
|
+
print(" No proposals found")
|
|
1041
|
+
for prop in result:
|
|
1042
|
+
print(
|
|
1043
|
+
f" {prop.get('id', '?'):16s} "
|
|
1044
|
+
f"{prop.get('status', '?'):12s} "
|
|
1045
|
+
f"cap={prop.get('capability_name', '?')[:25]:25s} "
|
|
1046
|
+
f"targets={prop.get('target_count', 0)} "
|
|
1047
|
+
f"by={prop.get('proposed_by', '?')}"
|
|
1048
|
+
)
|
|
1049
|
+
if prop.get("approver"):
|
|
1050
|
+
print(f" Approved by: {prop['approver']}")
|
|
1051
|
+
|
|
1052
|
+
else:
|
|
1053
|
+
print(json.dumps(result, indent=2, default=str))
|
|
1054
|
+
|
|
1055
|
+
except Exception as e:
|
|
1056
|
+
error = {"error": str(e)}
|
|
1057
|
+
if args.json:
|
|
1058
|
+
print(json.dumps(error, indent=2))
|
|
1059
|
+
else:
|
|
1060
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
1061
|
+
sys.exit(1)
|
|
1062
|
+
|
|
1063
|
+
|
|
1064
|
+
if __name__ == "__main__":
|
|
1065
|
+
main()
|