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,1038 @@
|
|
|
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
|
+
"""Innovation Scoring Engine — score and rank innovation signals using weighted multi-dimension analysis.
|
|
8
|
+
|
|
9
|
+
Scores innovation signals discovered by web_scanner.py using a 5-dimension weighted
|
|
10
|
+
average (D21 deterministic scoring pattern):
|
|
11
|
+
|
|
12
|
+
1. community_demand (0.30) — GitHub stars, SO votes, upvotes, issue frequency
|
|
13
|
+
2. impact_breadth (0.25) — Potential number of ICDEV projects/tenants affected
|
|
14
|
+
3. feasibility (0.20) — Can ICDEV build this with existing tools/layers?
|
|
15
|
+
4. compliance_alignment (0.15) — Does it strengthen compliance posture?
|
|
16
|
+
5. novelty (0.10) — Not already addressed by existing ICDEV capabilities
|
|
17
|
+
|
|
18
|
+
Architecture:
|
|
19
|
+
- Weights loaded from args/innovation_config.yaml under scoring.weights (D26 pattern)
|
|
20
|
+
- Thresholds: auto_queue >= 0.80, suggest >= 0.50, log_only < 0.50
|
|
21
|
+
- Status transitions: new -> scored (after scoring)
|
|
22
|
+
- Score + dimension breakdown stored in innovation_signals table
|
|
23
|
+
- Calibration adjusts weights based on marketplace adoption feedback
|
|
24
|
+
- All scoring is deterministic (D21 — reproducible, not probabilistic)
|
|
25
|
+
|
|
26
|
+
Usage:
|
|
27
|
+
# Score a single signal
|
|
28
|
+
python tools/innovation/signal_ranker.py --score --signal-id "sig-xxx" --json
|
|
29
|
+
|
|
30
|
+
# Score all unscored signals
|
|
31
|
+
python tools/innovation/signal_ranker.py --score-all --json
|
|
32
|
+
|
|
33
|
+
# Get top-scored signals
|
|
34
|
+
python tools/innovation/signal_ranker.py --top --limit 20 --min-score 0.5 --json
|
|
35
|
+
|
|
36
|
+
# Recalibrate weights from marketplace feedback
|
|
37
|
+
python tools/innovation/signal_ranker.py --calibrate --json
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
import argparse
|
|
41
|
+
import json
|
|
42
|
+
import os
|
|
43
|
+
import sqlite3
|
|
44
|
+
import sys
|
|
45
|
+
from datetime import datetime, timezone
|
|
46
|
+
from pathlib import Path
|
|
47
|
+
from icdev._paths import get_project_root
|
|
48
|
+
|
|
49
|
+
# =========================================================================
|
|
50
|
+
# PATH SETUP
|
|
51
|
+
# =========================================================================
|
|
52
|
+
BASE_DIR = get_project_root()
|
|
53
|
+
if str(BASE_DIR) not in sys.path:
|
|
54
|
+
sys.path.insert(0, str(BASE_DIR))
|
|
55
|
+
|
|
56
|
+
DB_PATH = Path(os.environ.get("ICDEV_DB_PATH", str(BASE_DIR / "data" / "icdev.db")))
|
|
57
|
+
CONFIG_PATH = BASE_DIR / "args" / "innovation_config.yaml"
|
|
58
|
+
|
|
59
|
+
# =========================================================================
|
|
60
|
+
# GRACEFUL IMPORTS
|
|
61
|
+
# =========================================================================
|
|
62
|
+
try:
|
|
63
|
+
import yaml
|
|
64
|
+
_HAS_YAML = True
|
|
65
|
+
except ImportError:
|
|
66
|
+
_HAS_YAML = False
|
|
67
|
+
|
|
68
|
+
try:
|
|
69
|
+
from icdev.tools.audit.audit_logger import log_event as audit_log_event
|
|
70
|
+
_HAS_AUDIT = True
|
|
71
|
+
except ImportError:
|
|
72
|
+
_HAS_AUDIT = False
|
|
73
|
+
def audit_log_event(**kwargs):
|
|
74
|
+
return -1
|
|
75
|
+
|
|
76
|
+
# =========================================================================
|
|
77
|
+
# DEFAULT CONFIGURATION
|
|
78
|
+
# =========================================================================
|
|
79
|
+
DEFAULT_WEIGHTS = {
|
|
80
|
+
"community_demand": 0.30,
|
|
81
|
+
"impact_breadth": 0.25,
|
|
82
|
+
"feasibility": 0.20,
|
|
83
|
+
"compliance_alignment": 0.15,
|
|
84
|
+
"novelty": 0.10,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
DEFAULT_THRESHOLDS = {
|
|
88
|
+
"auto_queue": 0.80,
|
|
89
|
+
"suggest": 0.50,
|
|
90
|
+
"log_only": 0.0,
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
# Categories that strengthen compliance posture (positive boost)
|
|
94
|
+
COMPLIANCE_POSITIVE_CATEGORIES = {
|
|
95
|
+
"security_vulnerability", "compliance_gap", "supply_chain",
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
# Categories neutral to compliance
|
|
99
|
+
COMPLIANCE_NEUTRAL_CATEGORIES = {
|
|
100
|
+
"developer_experience", "performance", "infrastructure",
|
|
101
|
+
"testing", "ai_tooling", "modernization",
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
# GOTCHA layer keyword mapping — used for feasibility scoring
|
|
105
|
+
# Mirrors triage.gotcha_fit.layer_mapping from innovation_config.yaml
|
|
106
|
+
DEFAULT_GOTCHA_LAYERS = {
|
|
107
|
+
"goal": ["workflow", "process", "procedure", "methodology", "best practice"],
|
|
108
|
+
"tool": ["script", "utility", "generator", "scanner", "checker", "validator", "analyzer"],
|
|
109
|
+
"arg": ["configuration", "setting", "threshold", "parameter", "tuning"],
|
|
110
|
+
"context": ["reference", "template", "sample", "example", "guideline", "standard"],
|
|
111
|
+
"hardprompt": ["prompt template", "instruction", "llm directive", "system prompt"],
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
# =========================================================================
|
|
116
|
+
# DATABASE HELPERS
|
|
117
|
+
# =========================================================================
|
|
118
|
+
def _get_db(db_path=None):
|
|
119
|
+
"""Get database connection with dict-like row access."""
|
|
120
|
+
path = db_path or DB_PATH
|
|
121
|
+
if not path.exists():
|
|
122
|
+
raise FileNotFoundError(
|
|
123
|
+
f"Database not found: {path}\nRun: python tools/db/init_icdev_db.py"
|
|
124
|
+
)
|
|
125
|
+
conn = sqlite3.connect(str(path))
|
|
126
|
+
conn.row_factory = sqlite3.Row
|
|
127
|
+
return conn
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def _now():
|
|
131
|
+
"""ISO-8601 UTC timestamp."""
|
|
132
|
+
return datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
def _audit(event_type, actor, action, details=None, project_id=None):
|
|
136
|
+
"""Write audit trail entry (best-effort, never raises)."""
|
|
137
|
+
if _HAS_AUDIT:
|
|
138
|
+
try:
|
|
139
|
+
audit_log_event(
|
|
140
|
+
event_type=event_type,
|
|
141
|
+
actor=actor,
|
|
142
|
+
action=action,
|
|
143
|
+
details=json.dumps(details) if details else None,
|
|
144
|
+
project_id=project_id or "innovation-engine",
|
|
145
|
+
)
|
|
146
|
+
except Exception:
|
|
147
|
+
pass
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def _load_config():
|
|
151
|
+
"""Load innovation config from YAML with fallback defaults."""
|
|
152
|
+
if not _HAS_YAML:
|
|
153
|
+
return {}
|
|
154
|
+
if not CONFIG_PATH.exists():
|
|
155
|
+
return {}
|
|
156
|
+
try:
|
|
157
|
+
with open(CONFIG_PATH, "r", encoding="utf-8") as f:
|
|
158
|
+
return yaml.safe_load(f) or {}
|
|
159
|
+
except Exception:
|
|
160
|
+
return {}
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
def _get_weights(config=None):
|
|
164
|
+
"""Extract scoring weights from config, falling back to defaults."""
|
|
165
|
+
if config is None:
|
|
166
|
+
config = _load_config()
|
|
167
|
+
scoring = config.get("scoring", {})
|
|
168
|
+
weights = scoring.get("weights", {})
|
|
169
|
+
result = {}
|
|
170
|
+
for dim, default_val in DEFAULT_WEIGHTS.items():
|
|
171
|
+
result[dim] = float(weights.get(dim, default_val))
|
|
172
|
+
# Normalize weights to sum to 1.0
|
|
173
|
+
total = sum(result.values())
|
|
174
|
+
if total > 0 and abs(total - 1.0) > 0.001:
|
|
175
|
+
result = {k: v / total for k, v in result.items()}
|
|
176
|
+
return result
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
def _get_thresholds(config=None):
|
|
180
|
+
"""Extract scoring thresholds from config, falling back to defaults."""
|
|
181
|
+
if config is None:
|
|
182
|
+
config = _load_config()
|
|
183
|
+
scoring = config.get("scoring", {})
|
|
184
|
+
thresholds = scoring.get("thresholds", {})
|
|
185
|
+
return {
|
|
186
|
+
"auto_queue": float(thresholds.get("auto_queue", DEFAULT_THRESHOLDS["auto_queue"])),
|
|
187
|
+
"suggest": float(thresholds.get("suggest", DEFAULT_THRESHOLDS["suggest"])),
|
|
188
|
+
"log_only": float(thresholds.get("log_only", DEFAULT_THRESHOLDS["log_only"])),
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
def _get_gotcha_layers(config=None):
|
|
193
|
+
"""Extract GOTCHA layer mapping from config, falling back to defaults."""
|
|
194
|
+
if config is None:
|
|
195
|
+
config = _load_config()
|
|
196
|
+
triage = config.get("triage", {})
|
|
197
|
+
gotcha_fit = triage.get("gotcha_fit", {})
|
|
198
|
+
layer_mapping = gotcha_fit.get("layer_mapping", {})
|
|
199
|
+
if layer_mapping:
|
|
200
|
+
return {k: [kw.lower() for kw in v] for k, v in layer_mapping.items()}
|
|
201
|
+
return {k: [kw.lower() for kw in v] for k, v in DEFAULT_GOTCHA_LAYERS.items()}
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def _get_signal_categories(config=None):
|
|
205
|
+
"""Extract signal category keywords from config."""
|
|
206
|
+
if config is None:
|
|
207
|
+
config = _load_config()
|
|
208
|
+
categories = config.get("signal_categories", {})
|
|
209
|
+
return categories
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
# =========================================================================
|
|
213
|
+
# DIMENSION SCORERS
|
|
214
|
+
# =========================================================================
|
|
215
|
+
def _score_community_demand(signal):
|
|
216
|
+
"""Score community demand dimension.
|
|
217
|
+
|
|
218
|
+
Uses the community_score field already set by web_scanner.py.
|
|
219
|
+
This field is normalized to [0, 1] by the scanner based on source-specific
|
|
220
|
+
metrics (GitHub stars/1000, SO votes/100, HN score/500, CVSS/10).
|
|
221
|
+
|
|
222
|
+
Args:
|
|
223
|
+
signal: Dict of signal row from DB.
|
|
224
|
+
|
|
225
|
+
Returns:
|
|
226
|
+
Float in [0.0, 1.0].
|
|
227
|
+
"""
|
|
228
|
+
raw = float(signal.get("community_score", 0.0) or 0.0)
|
|
229
|
+
# Clamp to [0, 1]
|
|
230
|
+
return max(0.0, min(1.0, raw))
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
def _score_impact_breadth(signal, conn):
|
|
234
|
+
"""Score impact breadth dimension.
|
|
235
|
+
|
|
236
|
+
Estimates how many ICDEV projects/tenants could benefit from addressing
|
|
237
|
+
this signal. Uses signal category to match against project types in DB.
|
|
238
|
+
|
|
239
|
+
Args:
|
|
240
|
+
signal: Dict of signal row from DB.
|
|
241
|
+
conn: Open database connection.
|
|
242
|
+
|
|
243
|
+
Returns:
|
|
244
|
+
Float in [0.0, 1.0].
|
|
245
|
+
"""
|
|
246
|
+
category = signal.get("category") or ""
|
|
247
|
+
title = (signal.get("title") or "").lower()
|
|
248
|
+
description = (signal.get("description") or "").lower()
|
|
249
|
+
text_corpus = f"{title} {description} {category}"
|
|
250
|
+
|
|
251
|
+
# Count total active projects
|
|
252
|
+
try:
|
|
253
|
+
total_projects = conn.execute(
|
|
254
|
+
"SELECT COUNT(*) as cnt FROM projects WHERE status = 'active'"
|
|
255
|
+
).fetchone()["cnt"]
|
|
256
|
+
except Exception:
|
|
257
|
+
total_projects = 0
|
|
258
|
+
|
|
259
|
+
if total_projects == 0:
|
|
260
|
+
# No projects in DB — use heuristic based on category breadth
|
|
261
|
+
# Security and compliance affect everyone; niche categories affect fewer
|
|
262
|
+
broad_keywords = [
|
|
263
|
+
"security", "compliance", "testing", "ci/cd", "pipeline",
|
|
264
|
+
"deployment", "monitoring", "authentication", "authorization",
|
|
265
|
+
]
|
|
266
|
+
narrow_keywords = [
|
|
267
|
+
"specific", "niche", "legacy", "deprecated", "single",
|
|
268
|
+
]
|
|
269
|
+
broad_matches = sum(1 for kw in broad_keywords if kw in text_corpus)
|
|
270
|
+
narrow_matches = sum(1 for kw in narrow_keywords if kw in text_corpus)
|
|
271
|
+
score = min(1.0, (broad_matches * 0.15) - (narrow_matches * 0.1))
|
|
272
|
+
return max(0.0, min(1.0, score + 0.3)) # Base score of 0.3
|
|
273
|
+
|
|
274
|
+
# Match signal against project types and tech stacks
|
|
275
|
+
affected = 0
|
|
276
|
+
|
|
277
|
+
# Category-to-project-type relevance mapping
|
|
278
|
+
category_project_map = {
|
|
279
|
+
"security_vulnerability": None, # Affects all projects
|
|
280
|
+
"compliance_gap": None, # Affects all projects
|
|
281
|
+
"supply_chain": None, # Affects all projects
|
|
282
|
+
"developer_experience": None, # Affects all projects
|
|
283
|
+
"infrastructure": ["microservice", "api", "webapp"],
|
|
284
|
+
"testing": None, # Affects all projects
|
|
285
|
+
"performance": ["webapp", "api", "microservice", "data_pipeline"],
|
|
286
|
+
"modernization": ["webapp", "api", "microservice"],
|
|
287
|
+
"ai_tooling": None, # Affects all projects
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
relevant_types = category_project_map.get(category)
|
|
291
|
+
|
|
292
|
+
if relevant_types is None:
|
|
293
|
+
# Affects all project types
|
|
294
|
+
affected = total_projects
|
|
295
|
+
else:
|
|
296
|
+
try:
|
|
297
|
+
placeholders = ",".join("?" for _ in relevant_types)
|
|
298
|
+
affected = conn.execute(
|
|
299
|
+
f"SELECT COUNT(*) as cnt FROM projects WHERE status = 'active' AND type IN ({placeholders})",
|
|
300
|
+
relevant_types,
|
|
301
|
+
).fetchone()["cnt"]
|
|
302
|
+
except Exception:
|
|
303
|
+
affected = total_projects // 2 # Conservative estimate
|
|
304
|
+
|
|
305
|
+
if total_projects > 0:
|
|
306
|
+
ratio = affected / total_projects
|
|
307
|
+
else:
|
|
308
|
+
ratio = 0.5
|
|
309
|
+
|
|
310
|
+
return max(0.0, min(1.0, ratio))
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
def _score_feasibility(signal, config=None):
|
|
314
|
+
"""Score feasibility dimension.
|
|
315
|
+
|
|
316
|
+
Checks if the signal category maps to an existing GOTCHA layer,
|
|
317
|
+
indicating ICDEV has the architecture to address it.
|
|
318
|
+
|
|
319
|
+
Args:
|
|
320
|
+
signal: Dict of signal row from DB.
|
|
321
|
+
config: Loaded innovation config (optional).
|
|
322
|
+
|
|
323
|
+
Returns:
|
|
324
|
+
Float in [0.0, 1.0].
|
|
325
|
+
"""
|
|
326
|
+
gotcha_layers = _get_gotcha_layers(config)
|
|
327
|
+
title = (signal.get("title") or "").lower()
|
|
328
|
+
description = (signal.get("description") or "").lower()
|
|
329
|
+
metadata_str = signal.get("metadata") or "{}"
|
|
330
|
+
try:
|
|
331
|
+
metadata = json.loads(metadata_str) if isinstance(metadata_str, str) else metadata_str
|
|
332
|
+
except (json.JSONDecodeError, TypeError):
|
|
333
|
+
metadata = {}
|
|
334
|
+
|
|
335
|
+
text_corpus = f"{title} {description} {json.dumps(metadata).lower()}"
|
|
336
|
+
|
|
337
|
+
# Count how many GOTCHA layers this signal maps to
|
|
338
|
+
layers_matched = 0
|
|
339
|
+
total_layers = len(gotcha_layers)
|
|
340
|
+
matched_layer_names = []
|
|
341
|
+
|
|
342
|
+
for layer_name, keywords in gotcha_layers.items():
|
|
343
|
+
for kw in keywords:
|
|
344
|
+
if kw in text_corpus:
|
|
345
|
+
layers_matched += 1
|
|
346
|
+
matched_layer_names.append(layer_name)
|
|
347
|
+
break # One match per layer is sufficient
|
|
348
|
+
|
|
349
|
+
if total_layers == 0:
|
|
350
|
+
return 0.5 # Unknown feasibility
|
|
351
|
+
|
|
352
|
+
# Base score from layer coverage
|
|
353
|
+
layer_ratio = layers_matched / total_layers
|
|
354
|
+
|
|
355
|
+
# Boost: signals matching "tool" layer are most directly actionable
|
|
356
|
+
tool_bonus = 0.15 if "tool" in matched_layer_names else 0.0
|
|
357
|
+
|
|
358
|
+
# Penalty: signals requiring external dependencies are harder
|
|
359
|
+
external_penalty = 0.0
|
|
360
|
+
hard_keywords = ["hardware", "physical", "proprietary", "closed-source", "manual"]
|
|
361
|
+
for kw in hard_keywords:
|
|
362
|
+
if kw in text_corpus:
|
|
363
|
+
external_penalty += 0.1
|
|
364
|
+
|
|
365
|
+
score = layer_ratio + tool_bonus - external_penalty
|
|
366
|
+
# Ensure minimum feasibility for anything that maps to at least one layer
|
|
367
|
+
if layers_matched > 0:
|
|
368
|
+
score = max(score, 0.3)
|
|
369
|
+
|
|
370
|
+
return max(0.0, min(1.0, score))
|
|
371
|
+
|
|
372
|
+
|
|
373
|
+
def _score_compliance_alignment(signal, config=None):
|
|
374
|
+
"""Score compliance alignment dimension.
|
|
375
|
+
|
|
376
|
+
Boosts signals in security/compliance categories, neutral for others,
|
|
377
|
+
penalizes if the signal could potentially weaken compliance posture.
|
|
378
|
+
|
|
379
|
+
Args:
|
|
380
|
+
signal: Dict of signal row from DB.
|
|
381
|
+
config: Loaded innovation config (optional).
|
|
382
|
+
|
|
383
|
+
Returns:
|
|
384
|
+
Float in [0.0, 1.0].
|
|
385
|
+
"""
|
|
386
|
+
category = signal.get("category") or ""
|
|
387
|
+
title = (signal.get("title") or "").lower()
|
|
388
|
+
description = (signal.get("description") or "").lower()
|
|
389
|
+
text_corpus = f"{title} {description}"
|
|
390
|
+
|
|
391
|
+
# Positive: directly strengthens compliance
|
|
392
|
+
if category in COMPLIANCE_POSITIVE_CATEGORIES:
|
|
393
|
+
base_score = 0.85
|
|
394
|
+
elif category in COMPLIANCE_NEUTRAL_CATEGORIES:
|
|
395
|
+
base_score = 0.50
|
|
396
|
+
else:
|
|
397
|
+
base_score = 0.50 # Unknown category gets neutral
|
|
398
|
+
|
|
399
|
+
# Boost for compliance-related keywords in text
|
|
400
|
+
compliance_keywords = [
|
|
401
|
+
"nist", "fedramp", "cmmc", "stig", "ato", "fips", "compliance",
|
|
402
|
+
"audit", "authorization", "security control", "cui", "classified",
|
|
403
|
+
"hipaa", "pci", "cjis", "soc 2", "iso 27001", "zero trust",
|
|
404
|
+
]
|
|
405
|
+
keyword_hits = sum(1 for kw in compliance_keywords if kw in text_corpus)
|
|
406
|
+
keyword_boost = min(0.15, keyword_hits * 0.03)
|
|
407
|
+
|
|
408
|
+
# Penalty for potentially weakening compliance
|
|
409
|
+
weakening_keywords = [
|
|
410
|
+
"bypass", "disable security", "skip auth", "remove check",
|
|
411
|
+
"ignore compliance", "workaround security",
|
|
412
|
+
]
|
|
413
|
+
weakening_hits = sum(1 for kw in weakening_keywords if kw in text_corpus)
|
|
414
|
+
weakening_penalty = min(0.4, weakening_hits * 0.2)
|
|
415
|
+
|
|
416
|
+
score = base_score + keyword_boost - weakening_penalty
|
|
417
|
+
return max(0.0, min(1.0, score))
|
|
418
|
+
|
|
419
|
+
|
|
420
|
+
def _score_novelty(signal, conn):
|
|
421
|
+
"""Score novelty dimension.
|
|
422
|
+
|
|
423
|
+
Checks whether the signal addresses something not already covered by
|
|
424
|
+
existing ICDEV capabilities. Searches knowledge_patterns and tool manifest
|
|
425
|
+
for similar patterns via keyword matching.
|
|
426
|
+
|
|
427
|
+
Args:
|
|
428
|
+
signal: Dict of signal row from DB.
|
|
429
|
+
conn: Open database connection.
|
|
430
|
+
|
|
431
|
+
Returns:
|
|
432
|
+
Float in [0.0, 1.0]. Higher = more novel (less overlap).
|
|
433
|
+
"""
|
|
434
|
+
title = (signal.get("title") or "").lower()
|
|
435
|
+
description = (signal.get("description") or "").lower()
|
|
436
|
+
|
|
437
|
+
# Extract significant words (simple tokenization, skip short words)
|
|
438
|
+
stop_words = {
|
|
439
|
+
"the", "and", "for", "that", "this", "with", "from", "are", "was",
|
|
440
|
+
"have", "has", "not", "but", "can", "will", "all", "been", "they",
|
|
441
|
+
"how", "use", "new", "when", "what", "who", "why", "does", "into",
|
|
442
|
+
}
|
|
443
|
+
words = set()
|
|
444
|
+
for token in f"{title} {description}".split():
|
|
445
|
+
cleaned = token.strip(".,;:!?()[]{}\"'`")
|
|
446
|
+
if len(cleaned) > 3 and cleaned not in stop_words:
|
|
447
|
+
words.add(cleaned)
|
|
448
|
+
|
|
449
|
+
if not words:
|
|
450
|
+
return 0.7 # No keywords to check — assume moderately novel
|
|
451
|
+
|
|
452
|
+
# Check against knowledge_patterns table
|
|
453
|
+
overlap_count = 0
|
|
454
|
+
total_checks = 0
|
|
455
|
+
|
|
456
|
+
try:
|
|
457
|
+
patterns = conn.execute(
|
|
458
|
+
"SELECT pattern_signature, description FROM knowledge_patterns"
|
|
459
|
+
).fetchall()
|
|
460
|
+
for pattern in patterns:
|
|
461
|
+
sig_text = (
|
|
462
|
+
(pattern["pattern_signature"] or "") + " " + (pattern["description"] or "")
|
|
463
|
+
).lower()
|
|
464
|
+
matches = sum(1 for w in words if w in sig_text)
|
|
465
|
+
if matches >= 3: # At least 3 keyword overlaps = significant similarity
|
|
466
|
+
overlap_count += 1
|
|
467
|
+
total_checks += 1
|
|
468
|
+
except Exception:
|
|
469
|
+
pass # Table may not exist or be empty
|
|
470
|
+
|
|
471
|
+
# Check against existing innovation_signals that are already scored/queued
|
|
472
|
+
try:
|
|
473
|
+
recent_signals = conn.execute(
|
|
474
|
+
"""SELECT title, description FROM innovation_signals
|
|
475
|
+
WHERE status IN ('scored', 'queued', 'in_progress', 'completed')
|
|
476
|
+
AND id != ?
|
|
477
|
+
ORDER BY discovered_at DESC LIMIT 200""",
|
|
478
|
+
(signal.get("id", ""),),
|
|
479
|
+
).fetchall()
|
|
480
|
+
for recent in recent_signals:
|
|
481
|
+
recent_text = (
|
|
482
|
+
(recent["title"] or "") + " " + (recent["description"] or "")
|
|
483
|
+
).lower()
|
|
484
|
+
matches = sum(1 for w in words if w in recent_text)
|
|
485
|
+
if matches >= 3:
|
|
486
|
+
overlap_count += 1
|
|
487
|
+
total_checks += 1
|
|
488
|
+
except Exception:
|
|
489
|
+
pass
|
|
490
|
+
|
|
491
|
+
if total_checks == 0:
|
|
492
|
+
return 0.9 # Nothing to compare against — very novel
|
|
493
|
+
|
|
494
|
+
# Novelty is inversely proportional to overlap
|
|
495
|
+
overlap_ratio = overlap_count / max(total_checks, 1)
|
|
496
|
+
novelty = 1.0 - min(1.0, overlap_ratio * 2.0) # Scale: 50% overlap = 0 novelty
|
|
497
|
+
|
|
498
|
+
return max(0.0, min(1.0, novelty))
|
|
499
|
+
|
|
500
|
+
|
|
501
|
+
# =========================================================================
|
|
502
|
+
# SCORING FUNCTIONS
|
|
503
|
+
# =========================================================================
|
|
504
|
+
def score_signal(signal_id, db_path=None):
|
|
505
|
+
"""Score a single innovation signal across all 5 dimensions.
|
|
506
|
+
|
|
507
|
+
Reads the signal from DB, computes each dimension score, calculates
|
|
508
|
+
the weighted average, updates the signal row, and returns the result.
|
|
509
|
+
|
|
510
|
+
Args:
|
|
511
|
+
signal_id: The signal ID (e.g., "sig-abc123def456").
|
|
512
|
+
db_path: Optional database path override.
|
|
513
|
+
|
|
514
|
+
Returns:
|
|
515
|
+
Dict with signal_id, overall score, dimension breakdown, status, and threshold.
|
|
516
|
+
"""
|
|
517
|
+
config = _load_config()
|
|
518
|
+
weights = _get_weights(config)
|
|
519
|
+
thresholds = _get_thresholds(config)
|
|
520
|
+
|
|
521
|
+
conn = _get_db(db_path)
|
|
522
|
+
try:
|
|
523
|
+
row = conn.execute(
|
|
524
|
+
"SELECT * FROM innovation_signals WHERE id = ?", (signal_id,)
|
|
525
|
+
).fetchone()
|
|
526
|
+
if not row:
|
|
527
|
+
raise ValueError(f"Signal not found: {signal_id}")
|
|
528
|
+
|
|
529
|
+
signal = dict(row)
|
|
530
|
+
|
|
531
|
+
# Compute each dimension
|
|
532
|
+
dimensions = {
|
|
533
|
+
"community_demand": _score_community_demand(signal),
|
|
534
|
+
"impact_breadth": _score_impact_breadth(signal, conn),
|
|
535
|
+
"feasibility": _score_feasibility(signal, config),
|
|
536
|
+
"compliance_alignment": _score_compliance_alignment(signal, config),
|
|
537
|
+
"novelty": _score_novelty(signal, conn),
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
# Weighted average (D21 deterministic pattern)
|
|
541
|
+
overall_score = sum(
|
|
542
|
+
dimensions[dim] * weights.get(dim, 0.0) for dim in dimensions
|
|
543
|
+
)
|
|
544
|
+
overall_score = round(max(0.0, min(1.0, overall_score)), 4)
|
|
545
|
+
|
|
546
|
+
# Determine threshold band
|
|
547
|
+
if overall_score >= thresholds["auto_queue"]:
|
|
548
|
+
threshold_band = "auto_queue"
|
|
549
|
+
elif overall_score >= thresholds["suggest"]:
|
|
550
|
+
threshold_band = "suggest"
|
|
551
|
+
else:
|
|
552
|
+
threshold_band = "log_only"
|
|
553
|
+
|
|
554
|
+
# Build score breakdown JSON
|
|
555
|
+
score_breakdown = {
|
|
556
|
+
"dimensions": {k: round(v, 4) for k, v in dimensions.items()},
|
|
557
|
+
"weights": weights,
|
|
558
|
+
"overall": overall_score,
|
|
559
|
+
"threshold_band": threshold_band,
|
|
560
|
+
"scored_at": _now(),
|
|
561
|
+
}
|
|
562
|
+
|
|
563
|
+
# Update DB: set score, score_breakdown, transition status new -> scored
|
|
564
|
+
conn.execute(
|
|
565
|
+
"""UPDATE innovation_signals
|
|
566
|
+
SET innovation_score = ?,
|
|
567
|
+
score_breakdown = ?,
|
|
568
|
+
status = 'scored'
|
|
569
|
+
WHERE id = ?""",
|
|
570
|
+
(
|
|
571
|
+
overall_score,
|
|
572
|
+
json.dumps(score_breakdown),
|
|
573
|
+
signal_id,
|
|
574
|
+
),
|
|
575
|
+
)
|
|
576
|
+
conn.commit()
|
|
577
|
+
|
|
578
|
+
_audit(
|
|
579
|
+
"innovation.score",
|
|
580
|
+
"innovation-agent",
|
|
581
|
+
f"Scored signal {signal_id}: {overall_score:.4f} ({threshold_band})",
|
|
582
|
+
{
|
|
583
|
+
"signal_id": signal_id,
|
|
584
|
+
"score": overall_score,
|
|
585
|
+
"threshold_band": threshold_band,
|
|
586
|
+
"dimensions": {k: round(v, 4) for k, v in dimensions.items()},
|
|
587
|
+
},
|
|
588
|
+
)
|
|
589
|
+
|
|
590
|
+
return {
|
|
591
|
+
"signal_id": signal_id,
|
|
592
|
+
"title": signal.get("title", ""),
|
|
593
|
+
"source": signal.get("source", ""),
|
|
594
|
+
"category": signal.get("category", ""),
|
|
595
|
+
"score": overall_score,
|
|
596
|
+
"threshold_band": threshold_band,
|
|
597
|
+
"dimensions": {k: round(v, 4) for k, v in dimensions.items()},
|
|
598
|
+
"weights_used": weights,
|
|
599
|
+
"status": "scored",
|
|
600
|
+
"scored_at": score_breakdown["scored_at"],
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
finally:
|
|
604
|
+
conn.close()
|
|
605
|
+
|
|
606
|
+
|
|
607
|
+
def score_all_new(db_path=None):
|
|
608
|
+
"""Score all signals with status='new'.
|
|
609
|
+
|
|
610
|
+
Iterates through unscored signals and applies the 5-dimension scoring.
|
|
611
|
+
Respects max_signals_per_scan from config to prevent overload.
|
|
612
|
+
|
|
613
|
+
Args:
|
|
614
|
+
db_path: Optional database path override.
|
|
615
|
+
|
|
616
|
+
Returns:
|
|
617
|
+
Dict with count of scored signals, errors, and score distribution.
|
|
618
|
+
"""
|
|
619
|
+
config = _load_config()
|
|
620
|
+
max_signals = config.get("scoring", {}).get("max_signals_per_scan", 500)
|
|
621
|
+
|
|
622
|
+
conn = _get_db(db_path)
|
|
623
|
+
try:
|
|
624
|
+
rows = conn.execute(
|
|
625
|
+
"""SELECT id FROM innovation_signals
|
|
626
|
+
WHERE status = 'new'
|
|
627
|
+
ORDER BY discovered_at ASC
|
|
628
|
+
LIMIT ?""",
|
|
629
|
+
(max_signals,),
|
|
630
|
+
).fetchall()
|
|
631
|
+
finally:
|
|
632
|
+
conn.close()
|
|
633
|
+
|
|
634
|
+
signal_ids = [row["id"] for row in rows]
|
|
635
|
+
|
|
636
|
+
scored = 0
|
|
637
|
+
errors = 0
|
|
638
|
+
error_details = []
|
|
639
|
+
score_distribution = {"auto_queue": 0, "suggest": 0, "log_only": 0}
|
|
640
|
+
|
|
641
|
+
for sid in signal_ids:
|
|
642
|
+
try:
|
|
643
|
+
result = score_signal(sid, db_path=db_path)
|
|
644
|
+
scored += 1
|
|
645
|
+
band = result.get("threshold_band", "log_only")
|
|
646
|
+
score_distribution[band] = score_distribution.get(band, 0) + 1
|
|
647
|
+
except Exception as e:
|
|
648
|
+
errors += 1
|
|
649
|
+
error_details.append({"signal_id": sid, "error": str(e)})
|
|
650
|
+
|
|
651
|
+
_audit(
|
|
652
|
+
"innovation.score_batch",
|
|
653
|
+
"innovation-agent",
|
|
654
|
+
f"Batch scored {scored} signals ({errors} errors)",
|
|
655
|
+
{
|
|
656
|
+
"scored": scored,
|
|
657
|
+
"errors": errors,
|
|
658
|
+
"distribution": score_distribution,
|
|
659
|
+
},
|
|
660
|
+
)
|
|
661
|
+
|
|
662
|
+
return {
|
|
663
|
+
"total_new": len(signal_ids),
|
|
664
|
+
"scored": scored,
|
|
665
|
+
"errors": errors,
|
|
666
|
+
"error_details": error_details[:10], # Cap error details
|
|
667
|
+
"score_distribution": score_distribution,
|
|
668
|
+
"scored_at": _now(),
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
|
|
672
|
+
def get_top_signals(limit=20, min_score=0.5, db_path=None):
|
|
673
|
+
"""Get highest-scored innovation signals.
|
|
674
|
+
|
|
675
|
+
Args:
|
|
676
|
+
limit: Maximum number of signals to return (default 20).
|
|
677
|
+
min_score: Minimum score threshold (default 0.5).
|
|
678
|
+
db_path: Optional database path override.
|
|
679
|
+
|
|
680
|
+
Returns:
|
|
681
|
+
Dict with list of top signals and summary statistics.
|
|
682
|
+
"""
|
|
683
|
+
conn = _get_db(db_path)
|
|
684
|
+
try:
|
|
685
|
+
rows = conn.execute(
|
|
686
|
+
"""SELECT id, source, source_type, title, category, url,
|
|
687
|
+
innovation_score, score_breakdown, status, discovered_at
|
|
688
|
+
FROM innovation_signals
|
|
689
|
+
WHERE innovation_score IS NOT NULL AND innovation_score >= ?
|
|
690
|
+
ORDER BY innovation_score DESC
|
|
691
|
+
LIMIT ?""",
|
|
692
|
+
(min_score, limit),
|
|
693
|
+
).fetchall()
|
|
694
|
+
|
|
695
|
+
signals = []
|
|
696
|
+
for row in rows:
|
|
697
|
+
entry = dict(row)
|
|
698
|
+
# Parse score_breakdown for dimension detail
|
|
699
|
+
try:
|
|
700
|
+
breakdown = json.loads(entry.get("score_breakdown") or "{}")
|
|
701
|
+
except (json.JSONDecodeError, TypeError):
|
|
702
|
+
breakdown = {}
|
|
703
|
+
entry["score_breakdown"] = breakdown
|
|
704
|
+
signals.append(entry)
|
|
705
|
+
|
|
706
|
+
# Summary statistics
|
|
707
|
+
total_scored = conn.execute(
|
|
708
|
+
"SELECT COUNT(*) as cnt FROM innovation_signals WHERE innovation_score IS NOT NULL"
|
|
709
|
+
).fetchone()["cnt"]
|
|
710
|
+
|
|
711
|
+
avg_score = conn.execute(
|
|
712
|
+
"SELECT AVG(innovation_score) as avg_score FROM innovation_signals WHERE innovation_score IS NOT NULL"
|
|
713
|
+
).fetchone()["avg_score"] or 0.0
|
|
714
|
+
|
|
715
|
+
distribution = {}
|
|
716
|
+
thresholds = _get_thresholds()
|
|
717
|
+
for band_name, band_min in [
|
|
718
|
+
("auto_queue", thresholds["auto_queue"]),
|
|
719
|
+
("suggest", thresholds["suggest"]),
|
|
720
|
+
("log_only", thresholds["log_only"]),
|
|
721
|
+
]:
|
|
722
|
+
band_count = conn.execute(
|
|
723
|
+
"""SELECT COUNT(*) as cnt FROM innovation_signals
|
|
724
|
+
WHERE innovation_score IS NOT NULL AND innovation_score >= ?""",
|
|
725
|
+
(band_min,),
|
|
726
|
+
).fetchone()["cnt"]
|
|
727
|
+
distribution[band_name] = band_count
|
|
728
|
+
|
|
729
|
+
# Correct distribution to be non-overlapping
|
|
730
|
+
distribution["auto_queue"] = distribution.get("auto_queue", 0)
|
|
731
|
+
distribution["suggest"] = (
|
|
732
|
+
distribution.get("suggest", 0) - distribution.get("auto_queue", 0)
|
|
733
|
+
)
|
|
734
|
+
distribution["log_only"] = (
|
|
735
|
+
distribution.get("log_only", 0)
|
|
736
|
+
- distribution.get("suggest", 0)
|
|
737
|
+
- distribution.get("auto_queue", 0)
|
|
738
|
+
)
|
|
739
|
+
|
|
740
|
+
return {
|
|
741
|
+
"signals": signals,
|
|
742
|
+
"count": len(signals),
|
|
743
|
+
"total_scored": total_scored,
|
|
744
|
+
"average_score": round(avg_score, 4),
|
|
745
|
+
"distribution": distribution,
|
|
746
|
+
"query": {"limit": limit, "min_score": min_score},
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
finally:
|
|
750
|
+
conn.close()
|
|
751
|
+
|
|
752
|
+
|
|
753
|
+
def calibrate_weights(db_path=None):
|
|
754
|
+
"""Recalibrate scoring weights based on marketplace adoption feedback.
|
|
755
|
+
|
|
756
|
+
Analyzes which score dimensions best predict marketplace success
|
|
757
|
+
(install count, ratings) and adjusts weights accordingly. Uses
|
|
758
|
+
feedback config for step size and minimum data point requirements.
|
|
759
|
+
|
|
760
|
+
Args:
|
|
761
|
+
db_path: Optional database path override.
|
|
762
|
+
|
|
763
|
+
Returns:
|
|
764
|
+
Dict with old weights, new weights, adjustment rationale, and data points used.
|
|
765
|
+
"""
|
|
766
|
+
config = _load_config()
|
|
767
|
+
feedback_config = config.get("feedback", {})
|
|
768
|
+
adjustment_step = float(feedback_config.get("weight_adjustment_step", 0.02))
|
|
769
|
+
min_data_points = int(feedback_config.get("min_data_points", 10))
|
|
770
|
+
|
|
771
|
+
current_weights = _get_weights(config)
|
|
772
|
+
old_weights = dict(current_weights)
|
|
773
|
+
|
|
774
|
+
conn = _get_db(db_path)
|
|
775
|
+
try:
|
|
776
|
+
# Collect signals that have been implemented and have marketplace feedback
|
|
777
|
+
# Join innovation_signals with marketplace_installations/ratings if available
|
|
778
|
+
completed_signals = []
|
|
779
|
+
try:
|
|
780
|
+
rows = conn.execute(
|
|
781
|
+
"""SELECT s.id, s.innovation_score, s.score_breakdown, s.category
|
|
782
|
+
FROM innovation_signals s
|
|
783
|
+
WHERE s.status IN ('completed', 'queued')
|
|
784
|
+
AND s.innovation_score IS NOT NULL
|
|
785
|
+
AND s.score_breakdown IS NOT NULL
|
|
786
|
+
ORDER BY s.discovered_at DESC
|
|
787
|
+
LIMIT 500"""
|
|
788
|
+
).fetchall()
|
|
789
|
+
completed_signals = [dict(r) for r in rows]
|
|
790
|
+
except Exception:
|
|
791
|
+
pass
|
|
792
|
+
|
|
793
|
+
if len(completed_signals) < min_data_points:
|
|
794
|
+
return {
|
|
795
|
+
"calibrated": False,
|
|
796
|
+
"reason": f"Insufficient data points ({len(completed_signals)}/{min_data_points})",
|
|
797
|
+
"old_weights": old_weights,
|
|
798
|
+
"new_weights": old_weights,
|
|
799
|
+
"data_points": len(completed_signals),
|
|
800
|
+
"adjustments": {},
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
# Analyze dimension correlations with success
|
|
804
|
+
# Success heuristic: signals that reached 'completed' status are successes;
|
|
805
|
+
# 'queued' signals with high scores that stalled may indicate scoring issues
|
|
806
|
+
dimension_success = {dim: [] for dim in DEFAULT_WEIGHTS}
|
|
807
|
+
dimension_stall = {dim: [] for dim in DEFAULT_WEIGHTS}
|
|
808
|
+
|
|
809
|
+
for sig in completed_signals:
|
|
810
|
+
try:
|
|
811
|
+
breakdown = json.loads(sig.get("score_breakdown") or "{}")
|
|
812
|
+
dims = breakdown.get("dimensions", {})
|
|
813
|
+
except (json.JSONDecodeError, TypeError):
|
|
814
|
+
continue
|
|
815
|
+
|
|
816
|
+
if sig.get("status") == "completed":
|
|
817
|
+
for dim, val in dims.items():
|
|
818
|
+
if dim in dimension_success:
|
|
819
|
+
dimension_success[dim].append(float(val))
|
|
820
|
+
else:
|
|
821
|
+
for dim, val in dims.items():
|
|
822
|
+
if dim in dimension_stall:
|
|
823
|
+
dimension_stall[dim].append(float(val))
|
|
824
|
+
|
|
825
|
+
# Calculate average dimension scores for successes vs stalls
|
|
826
|
+
adjustments = {}
|
|
827
|
+
for dim in DEFAULT_WEIGHTS:
|
|
828
|
+
success_vals = dimension_success.get(dim, [])
|
|
829
|
+
stall_vals = dimension_stall.get(dim, [])
|
|
830
|
+
|
|
831
|
+
success_avg = sum(success_vals) / len(success_vals) if success_vals else 0.5
|
|
832
|
+
stall_avg = sum(stall_vals) / len(stall_vals) if stall_vals else 0.5
|
|
833
|
+
|
|
834
|
+
# If successes score higher on this dimension, boost its weight
|
|
835
|
+
delta = success_avg - stall_avg
|
|
836
|
+
if delta > 0.05:
|
|
837
|
+
adj = min(adjustment_step, delta * 0.1)
|
|
838
|
+
adjustments[dim] = {"direction": "increase", "step": round(adj, 4)}
|
|
839
|
+
current_weights[dim] = current_weights[dim] + adj
|
|
840
|
+
elif delta < -0.05:
|
|
841
|
+
adj = min(adjustment_step, abs(delta) * 0.1)
|
|
842
|
+
adjustments[dim] = {"direction": "decrease", "step": round(adj, 4)}
|
|
843
|
+
current_weights[dim] = max(0.02, current_weights[dim] - adj)
|
|
844
|
+
else:
|
|
845
|
+
adjustments[dim] = {"direction": "unchanged", "step": 0.0}
|
|
846
|
+
|
|
847
|
+
# Re-normalize to sum to 1.0
|
|
848
|
+
total = sum(current_weights.values())
|
|
849
|
+
if total > 0:
|
|
850
|
+
current_weights = {k: round(v / total, 4) for k, v in current_weights.items()}
|
|
851
|
+
|
|
852
|
+
# Ensure no weight drops below 0.02 (2%)
|
|
853
|
+
for dim in current_weights:
|
|
854
|
+
if current_weights[dim] < 0.02:
|
|
855
|
+
current_weights[dim] = 0.02
|
|
856
|
+
|
|
857
|
+
# Final normalization
|
|
858
|
+
total = sum(current_weights.values())
|
|
859
|
+
if total > 0 and abs(total - 1.0) > 0.001:
|
|
860
|
+
current_weights = {k: round(v / total, 4) for k, v in current_weights.items()}
|
|
861
|
+
|
|
862
|
+
_audit(
|
|
863
|
+
"innovation.calibrate",
|
|
864
|
+
"innovation-agent",
|
|
865
|
+
"Recalibrated scoring weights",
|
|
866
|
+
{
|
|
867
|
+
"old_weights": old_weights,
|
|
868
|
+
"new_weights": current_weights,
|
|
869
|
+
"adjustments": adjustments,
|
|
870
|
+
"data_points": len(completed_signals),
|
|
871
|
+
},
|
|
872
|
+
)
|
|
873
|
+
|
|
874
|
+
return {
|
|
875
|
+
"calibrated": True,
|
|
876
|
+
"old_weights": old_weights,
|
|
877
|
+
"new_weights": current_weights,
|
|
878
|
+
"adjustments": adjustments,
|
|
879
|
+
"data_points": len(completed_signals),
|
|
880
|
+
"calibrated_at": _now(),
|
|
881
|
+
"note": "Weights computed but NOT persisted to YAML. "
|
|
882
|
+
"Review adjustments and update args/innovation_config.yaml manually.",
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
finally:
|
|
886
|
+
conn.close()
|
|
887
|
+
|
|
888
|
+
|
|
889
|
+
# =========================================================================
|
|
890
|
+
# CLI
|
|
891
|
+
# =========================================================================
|
|
892
|
+
def main():
|
|
893
|
+
parser = argparse.ArgumentParser(
|
|
894
|
+
description="ICDEV Innovation Scoring Engine — score and rank innovation signals"
|
|
895
|
+
)
|
|
896
|
+
parser.add_argument("--json", action="store_true", help="JSON output")
|
|
897
|
+
parser.add_argument(
|
|
898
|
+
"--db-path", type=Path, default=None, help="Database path override"
|
|
899
|
+
)
|
|
900
|
+
|
|
901
|
+
group = parser.add_mutually_exclusive_group(required=True)
|
|
902
|
+
group.add_argument("--score", action="store_true", help="Score a single signal")
|
|
903
|
+
group.add_argument("--score-all", action="store_true", help="Score all new signals")
|
|
904
|
+
group.add_argument("--top", action="store_true", help="Get top-scored signals")
|
|
905
|
+
group.add_argument(
|
|
906
|
+
"--calibrate", action="store_true", help="Recalibrate weights from feedback"
|
|
907
|
+
)
|
|
908
|
+
|
|
909
|
+
parser.add_argument(
|
|
910
|
+
"--signal-id", type=str, help="Signal ID to score (with --score)"
|
|
911
|
+
)
|
|
912
|
+
parser.add_argument(
|
|
913
|
+
"--limit", type=int, default=20, help="Max signals to return (with --top)"
|
|
914
|
+
)
|
|
915
|
+
parser.add_argument(
|
|
916
|
+
"--min-score",
|
|
917
|
+
type=float,
|
|
918
|
+
default=0.5,
|
|
919
|
+
help="Minimum score threshold (with --top)",
|
|
920
|
+
)
|
|
921
|
+
|
|
922
|
+
args = parser.parse_args()
|
|
923
|
+
|
|
924
|
+
try:
|
|
925
|
+
if args.score:
|
|
926
|
+
if not args.signal_id:
|
|
927
|
+
parser.error("--score requires --signal-id")
|
|
928
|
+
result = score_signal(args.signal_id, db_path=args.db_path)
|
|
929
|
+
elif args.score_all:
|
|
930
|
+
result = score_all_new(db_path=args.db_path)
|
|
931
|
+
elif args.top:
|
|
932
|
+
result = get_top_signals(
|
|
933
|
+
limit=args.limit, min_score=args.min_score, db_path=args.db_path
|
|
934
|
+
)
|
|
935
|
+
elif args.calibrate:
|
|
936
|
+
result = calibrate_weights(db_path=args.db_path)
|
|
937
|
+
else:
|
|
938
|
+
result = {"error": "No action specified"}
|
|
939
|
+
|
|
940
|
+
if args.json:
|
|
941
|
+
print(json.dumps(result, indent=2, default=str))
|
|
942
|
+
else:
|
|
943
|
+
_print_human(args, result)
|
|
944
|
+
|
|
945
|
+
except FileNotFoundError as e:
|
|
946
|
+
error = {"error": str(e), "hint": "Run: python tools/db/init_icdev_db.py"}
|
|
947
|
+
if args.json:
|
|
948
|
+
print(json.dumps(error, indent=2))
|
|
949
|
+
else:
|
|
950
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
951
|
+
sys.exit(1)
|
|
952
|
+
except ValueError as e:
|
|
953
|
+
error = {"error": str(e)}
|
|
954
|
+
if args.json:
|
|
955
|
+
print(json.dumps(error, indent=2))
|
|
956
|
+
else:
|
|
957
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
958
|
+
sys.exit(1)
|
|
959
|
+
except Exception as e:
|
|
960
|
+
error = {"error": str(e)}
|
|
961
|
+
if args.json:
|
|
962
|
+
print(json.dumps(error, indent=2))
|
|
963
|
+
else:
|
|
964
|
+
print(f"ERROR: {e}", file=sys.stderr)
|
|
965
|
+
sys.exit(1)
|
|
966
|
+
|
|
967
|
+
|
|
968
|
+
def _print_human(args, result):
|
|
969
|
+
"""Print human-readable output for each command."""
|
|
970
|
+
if args.score:
|
|
971
|
+
print(f"Signal: {result.get('signal_id', '')}")
|
|
972
|
+
print(f"Title: {result.get('title', '')}")
|
|
973
|
+
print(f"Source: {result.get('source', '')}")
|
|
974
|
+
print(f"Category: {result.get('category', '')}")
|
|
975
|
+
print(f"Score: {result.get('score', 0):.4f} [{result.get('threshold_band', '')}]")
|
|
976
|
+
print(f"Status: {result.get('status', '')}")
|
|
977
|
+
print("Dimensions:")
|
|
978
|
+
for dim, val in result.get("dimensions", {}).items():
|
|
979
|
+
weight = result.get("weights_used", {}).get(dim, 0)
|
|
980
|
+
bar = "#" * int(val * 20)
|
|
981
|
+
print(f" {dim:25s} {val:.4f} (w={weight:.2f}) |{bar:<20s}|")
|
|
982
|
+
|
|
983
|
+
elif args.score_all:
|
|
984
|
+
print(f"Batch scoring completed at {result.get('scored_at', '')}")
|
|
985
|
+
print(f" New signals found: {result.get('total_new', 0)}")
|
|
986
|
+
print(f" Successfully scored: {result.get('scored', 0)}")
|
|
987
|
+
print(f" Errors: {result.get('errors', 0)}")
|
|
988
|
+
dist = result.get("score_distribution", {})
|
|
989
|
+
print("Score distribution:")
|
|
990
|
+
print(f" auto_queue (>=0.80): {dist.get('auto_queue', 0)}")
|
|
991
|
+
print(f" suggest (>=0.50): {dist.get('suggest', 0)}")
|
|
992
|
+
print(f" log_only (<0.50): {dist.get('log_only', 0)}")
|
|
993
|
+
if result.get("error_details"):
|
|
994
|
+
print("Errors:")
|
|
995
|
+
for err in result["error_details"][:5]:
|
|
996
|
+
print(f" {err['signal_id']}: {err['error']}")
|
|
997
|
+
|
|
998
|
+
elif args.top:
|
|
999
|
+
print(f"Top Innovation Signals (min_score={result.get('query', {}).get('min_score', 0.5)}):")
|
|
1000
|
+
print(f" Total scored: {result.get('total_scored', 0)}")
|
|
1001
|
+
print(f" Average score: {result.get('average_score', 0):.4f}")
|
|
1002
|
+
print(f" Showing: {result.get('count', 0)} signals")
|
|
1003
|
+
print()
|
|
1004
|
+
for i, sig in enumerate(result.get("signals", []), 1):
|
|
1005
|
+
score = sig.get("score", 0) or 0
|
|
1006
|
+
print(f" {i:2d}. [{score:.4f}] {sig.get('title', '')[:70]}")
|
|
1007
|
+
print(f" Source: {sig.get('source', '')} | Status: {sig.get('status', '')}")
|
|
1008
|
+
breakdown = sig.get("score_breakdown", {})
|
|
1009
|
+
dims = breakdown.get("dimensions", {})
|
|
1010
|
+
if dims:
|
|
1011
|
+
dim_str = " ".join(f"{k[:8]}={v:.2f}" for k, v in dims.items())
|
|
1012
|
+
print(f" {dim_str}")
|
|
1013
|
+
print()
|
|
1014
|
+
|
|
1015
|
+
elif args.calibrate:
|
|
1016
|
+
if result.get("calibrated"):
|
|
1017
|
+
print(f"Weights recalibrated at {result.get('calibrated_at', '')}")
|
|
1018
|
+
print(f"Data points used: {result.get('data_points', 0)}")
|
|
1019
|
+
print()
|
|
1020
|
+
print(f" {'Dimension':<25s} {'Old':>8s} {'New':>8s} {'Direction':>12s}")
|
|
1021
|
+
print(f" {'-' * 55}")
|
|
1022
|
+
old_w = result.get("old_weights", {})
|
|
1023
|
+
new_w = result.get("new_weights", {})
|
|
1024
|
+
for dim in DEFAULT_WEIGHTS:
|
|
1025
|
+
adj = result.get("adjustments", {}).get(dim, {})
|
|
1026
|
+
direction = adj.get("direction", "unchanged")
|
|
1027
|
+
print(
|
|
1028
|
+
f" {dim:<25s} {old_w.get(dim, 0):>8.4f} {new_w.get(dim, 0):>8.4f} {direction:>12s}"
|
|
1029
|
+
)
|
|
1030
|
+
print()
|
|
1031
|
+
print(f"NOTE: {result.get('note', '')}")
|
|
1032
|
+
else:
|
|
1033
|
+
print(f"Calibration skipped: {result.get('reason', 'unknown')}")
|
|
1034
|
+
print(f"Data points available: {result.get('data_points', 0)}")
|
|
1035
|
+
|
|
1036
|
+
|
|
1037
|
+
if __name__ == "__main__":
|
|
1038
|
+
main()
|