codd-dev 1.40.0__tar.gz → 1.41.0__tar.gz
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.
- {codd_dev-1.40.0 → codd_dev-1.41.0}/PKG-INFO +1 -1
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/__init__.py +1 -1
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/cli.py +51 -1
- codd_dev-1.41.0/codd/init/__init__.py +2 -0
- codd_dev-1.41.0/codd/init/lexicon_suggest.py +117 -0
- codd_dev-1.41.0/codd/init/stack_detector.py +170 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +54 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +177 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +11 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +34 -0
- codd_dev-1.41.0/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +25 -0
- codd_dev-1.41.0/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +79 -0
- codd_dev-1.41.0/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +261 -0
- codd_dev-1.41.0/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +29 -0
- codd_dev-1.41.0/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +56 -0
- codd_dev-1.41.0/codd_plugins/lexicons/babok/elicit_extend.md +90 -0
- codd_dev-1.41.0/codd_plugins/lexicons/babok/manifest.yaml +7 -0
- codd_dev-1.41.0/codd_plugins/lexicons/babok/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +66 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +145 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +20 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +8 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +25 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +20 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_graphql/elicit_extend.md +78 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_graphql/lexicon.yaml +245 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_graphql/manifest.yaml +17 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +12 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +44 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +17 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +71 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +185 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +25 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +35 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +56 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +209 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +22 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +11 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +34 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +25 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +76 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +226 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +54 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +59 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +229 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +20 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +13 -0
- codd_dev-1.41.0/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +40 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +69 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +133 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +28 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +55 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +229 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +20 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +13 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +40 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +75 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +201 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +11 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +41 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +20 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +73 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +185 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +20 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +11 -0
- codd_dev-1.41.0/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +41 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +71 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +149 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +24 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +28 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +52 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +145 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +22 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +13 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +40 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +52 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +133 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +22 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +13 -0
- codd_dev-1.41.0/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +40 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +17 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +71 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +114 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +33 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +79 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +249 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +25 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +11 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +41 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +80 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +297 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +25 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +13 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +47 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +74 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +169 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +23 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +35 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_iso25010/elicit_extend.md +69 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_iso25010/lexicon.yaml +186 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_iso25010/manifest.yaml +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +10 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +36 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +68 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +114 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +27 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +8 -0
- codd_dev-1.41.0/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +30 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +22 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +51 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +233 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +14 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +43 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +73 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +166 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +22 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +8 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +30 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +17 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +64 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +125 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_browser_compat/manifest.yaml +20 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +8 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +25 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +65 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +221 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_forms_html5/manifest.yaml +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +10 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +31 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +68 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +170 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +32 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +8 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +30 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +17 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +63 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +165 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +28 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_responsive/coverage_matrix.md +17 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_responsive/elicit_extend.md +44 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_responsive/lexicon.yaml +113 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_responsive/manifest.yaml +18 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_responsive/severity_rules.yaml +28 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +21 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +61 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +141 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_security_owasp/manifest.yaml +22 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +16 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +53 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +17 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +62 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +193 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +19 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +9 -0
- codd_dev-1.41.0/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +28 -0
- codd_dev-1.41.0/codd_plugins/stack_map.yaml +78 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/pyproject.toml +5 -3
- {codd_dev-1.40.0 → codd_dev-1.41.0}/.gitignore +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/LICENSE +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/README.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/__main__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/_git_helper.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/assembler.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/bridge.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/clustering.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/coherence_engine.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/config.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/contracts.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/builder.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/extractor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/dag/runner.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/defaults.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployer.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/design_md.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/diff/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/diff/apply.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/diff/engine.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/diff/persistence.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/drift.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/e2e_generator.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/e2e_runner.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/apply.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/engine.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/finding.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/env_refs.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/extract_ai.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/extractor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/fixer.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/fixup_drift.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/generator.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/graph.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/hitl_session.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/implementer.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/inheritance.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/lexicon.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/approval.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/parser.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/mcp_server.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/measure.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/parsing.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/planner.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/policy.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/propagate.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/propagator.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/registry.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/engine.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/history.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/loop.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/schema.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/repair_slice.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/require.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/require_plugins.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/require_propagate.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/restore.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/routes_extractor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/scanner.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/schema_refs.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/synth.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/traceability.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/validator.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/watch/__init__.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/watch/events.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/watch/watcher.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/codd/wiring.py +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/docs/requirements/README.md +0 -0
- {codd_dev-1.40.0 → codd_dev-1.41.0}/tests/integration/standalone_repair_skeleton/README.md +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: codd-dev
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.41.0
|
|
4
4
|
Summary: CoDD: Coherence-Driven Development — cross-artifact change impact analysis
|
|
5
5
|
Project-URL: Homepage, https://github.com/yohey-w/codd-dev
|
|
6
6
|
Project-URL: Repository, https://github.com/yohey-w/codd-dev
|
|
@@ -458,7 +458,19 @@ def _format_preflight_ntfy(result: Any) -> str:
|
|
|
458
458
|
default="codd",
|
|
459
459
|
help="Name of the CoDD config directory (default: codd). Use .codd when codd/ is your source directory.",
|
|
460
460
|
)
|
|
461
|
-
|
|
461
|
+
@click.option(
|
|
462
|
+
"--suggest-lexicons/--no-suggest-lexicons",
|
|
463
|
+
default=True,
|
|
464
|
+
help="Detect project manifests and offer lexicon plug-in suggestions.",
|
|
465
|
+
)
|
|
466
|
+
def init(
|
|
467
|
+
project_name: str,
|
|
468
|
+
language: str,
|
|
469
|
+
dest: str,
|
|
470
|
+
requirements: str | None,
|
|
471
|
+
config_dir: str,
|
|
472
|
+
suggest_lexicons: bool,
|
|
473
|
+
):
|
|
462
474
|
"""Initialize CoDD in a project directory."""
|
|
463
475
|
dest_path = Path(dest).resolve()
|
|
464
476
|
codd_dir = dest_path / config_dir
|
|
@@ -508,6 +520,44 @@ def init(project_name: str, language: str, dest: str, requirements: str | None,
|
|
|
508
520
|
click.echo(f" codd init --requirements your-spec.md --dest .")
|
|
509
521
|
click.echo(f" or: codd generate --wave 2 (auto-generates everything)")
|
|
510
522
|
|
|
523
|
+
if suggest_lexicons:
|
|
524
|
+
_offer_lexicon_suggestions(dest_path)
|
|
525
|
+
|
|
526
|
+
|
|
527
|
+
def _offer_lexicon_suggestions(project_root: Path) -> None:
|
|
528
|
+
from codd.init.lexicon_suggest import (
|
|
529
|
+
append_suggested_lexicons,
|
|
530
|
+
describe_lexicons,
|
|
531
|
+
load_stack_map,
|
|
532
|
+
suggest_lexicons,
|
|
533
|
+
)
|
|
534
|
+
from codd.init.stack_detector import StackDetector
|
|
535
|
+
|
|
536
|
+
detection = StackDetector().detect(project_root)
|
|
537
|
+
if not detection.stack_hints:
|
|
538
|
+
return
|
|
539
|
+
|
|
540
|
+
suggestions = suggest_lexicons(detection.stack_hints, load_stack_map())
|
|
541
|
+
if not suggestions:
|
|
542
|
+
return
|
|
543
|
+
|
|
544
|
+
descriptions = describe_lexicons(suggestions)
|
|
545
|
+
click.echo("")
|
|
546
|
+
click.echo(f"Detected signals: {', '.join(detection.detected_signals)}")
|
|
547
|
+
click.echo(f"Detected hints: {', '.join(detection.stack_hints)}")
|
|
548
|
+
click.echo("Suggested lexicons:")
|
|
549
|
+
for lexicon_id in suggestions:
|
|
550
|
+
description = descriptions.get(lexicon_id, "")
|
|
551
|
+
suffix = f" ({description})" if description else ""
|
|
552
|
+
click.echo(f" - {lexicon_id}{suffix}")
|
|
553
|
+
|
|
554
|
+
if not click.confirm(f"Add to {LEXICON_FILENAME}?", default=True):
|
|
555
|
+
click.echo("Suggested lexicons not added.")
|
|
556
|
+
return
|
|
557
|
+
path = append_suggested_lexicons(project_root, suggestions)
|
|
558
|
+
rel_path = path.relative_to(project_root).as_posix()
|
|
559
|
+
click.echo(f"{rel_path} updated ({len(suggestions)} suggested lexicons)")
|
|
560
|
+
|
|
511
561
|
|
|
512
562
|
@main.command()
|
|
513
563
|
@click.option("--path", default=".", help="Project root directory")
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"""Suggest lexicon plug-ins from generic stack detection results."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Iterable, Sequence
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
import re
|
|
10
|
+
|
|
11
|
+
import yaml
|
|
12
|
+
|
|
13
|
+
from codd.lexicon import LEXICON_FILENAME
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@dataclass(frozen=True)
|
|
17
|
+
class StackMapEntry:
|
|
18
|
+
hint_pattern: str
|
|
19
|
+
suggested_lexicons: tuple[str, ...]
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def default_stack_map_path() -> Path:
|
|
23
|
+
return Path(__file__).resolve().parents[2] / "codd_plugins" / "stack_map.yaml"
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def default_lexicon_root() -> Path:
|
|
27
|
+
return Path(__file__).resolve().parents[2] / "codd_plugins" / "lexicons"
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
def load_stack_map(path: Path | None = None) -> list[StackMapEntry]:
|
|
31
|
+
source = path or default_stack_map_path()
|
|
32
|
+
payload = yaml.safe_load(source.read_text(encoding="utf-8")) or {}
|
|
33
|
+
rows = payload.get("stack_map", [])
|
|
34
|
+
if not isinstance(rows, list):
|
|
35
|
+
raise ValueError("stack_map.yaml must contain a stack_map list")
|
|
36
|
+
entries: list[StackMapEntry] = []
|
|
37
|
+
for row in rows:
|
|
38
|
+
if not isinstance(row, dict):
|
|
39
|
+
raise ValueError("stack_map entries must be mappings")
|
|
40
|
+
pattern = str(row.get("hint_pattern", "")).strip()
|
|
41
|
+
lexicons = tuple(str(item).strip() for item in row.get("suggested_lexicons", []) if str(item).strip())
|
|
42
|
+
if not pattern or not lexicons:
|
|
43
|
+
raise ValueError("stack_map entries require hint_pattern and suggested_lexicons")
|
|
44
|
+
re.compile(pattern)
|
|
45
|
+
entries.append(StackMapEntry(pattern, lexicons))
|
|
46
|
+
return entries
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def suggest_lexicons(stack_hints: Sequence[str], entries: Sequence[StackMapEntry]) -> list[str]:
|
|
50
|
+
suggested: list[str] = []
|
|
51
|
+
seen: set[str] = set()
|
|
52
|
+
for hint in stack_hints:
|
|
53
|
+
for entry in entries:
|
|
54
|
+
if not re.search(entry.hint_pattern, hint, flags=re.IGNORECASE):
|
|
55
|
+
continue
|
|
56
|
+
for lexicon in entry.suggested_lexicons:
|
|
57
|
+
if lexicon in seen:
|
|
58
|
+
continue
|
|
59
|
+
seen.add(lexicon)
|
|
60
|
+
suggested.append(lexicon)
|
|
61
|
+
return suggested
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def describe_lexicons(lexicon_ids: Iterable[str], lexicon_root: Path | None = None) -> dict[str, str]:
|
|
65
|
+
root = lexicon_root or default_lexicon_root()
|
|
66
|
+
descriptions: dict[str, str] = {}
|
|
67
|
+
for lexicon_id in lexicon_ids:
|
|
68
|
+
manifest = root / lexicon_id / "manifest.yaml"
|
|
69
|
+
if not manifest.is_file():
|
|
70
|
+
descriptions[lexicon_id] = ""
|
|
71
|
+
continue
|
|
72
|
+
payload = yaml.safe_load(manifest.read_text(encoding="utf-8")) or {}
|
|
73
|
+
descriptions[lexicon_id] = str(payload.get("description", ""))
|
|
74
|
+
return descriptions
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
def append_suggested_lexicons(project_root: Path, lexicon_ids: Sequence[str]) -> Path:
|
|
78
|
+
path = Path(project_root) / LEXICON_FILENAME
|
|
79
|
+
data = _load_project_lexicon(path)
|
|
80
|
+
current = data.get("suggested_lexicons", [])
|
|
81
|
+
if not isinstance(current, list):
|
|
82
|
+
raise ValueError("project_lexicon.yaml suggested_lexicons must be a list")
|
|
83
|
+
known = {_lexicon_id(item) for item in current}
|
|
84
|
+
merged = list(current)
|
|
85
|
+
for lexicon_id in lexicon_ids:
|
|
86
|
+
if lexicon_id in known:
|
|
87
|
+
continue
|
|
88
|
+
merged.append(lexicon_id)
|
|
89
|
+
known.add(lexicon_id)
|
|
90
|
+
data["suggested_lexicons"] = merged
|
|
91
|
+
path.write_text(yaml.safe_dump(data, sort_keys=False, allow_unicode=True), encoding="utf-8")
|
|
92
|
+
return path
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _load_project_lexicon(path: Path) -> dict[str, Any]:
|
|
96
|
+
if path.is_file():
|
|
97
|
+
payload = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
|
|
98
|
+
if not isinstance(payload, dict):
|
|
99
|
+
raise ValueError("project_lexicon.yaml must contain a YAML mapping")
|
|
100
|
+
return payload
|
|
101
|
+
return {
|
|
102
|
+
"version": "1.0",
|
|
103
|
+
"node_vocabulary": [],
|
|
104
|
+
"naming_conventions": [],
|
|
105
|
+
"design_principles": [
|
|
106
|
+
"Review suggested lexicons before treating project conventions as approved.",
|
|
107
|
+
],
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _lexicon_id(item: Any) -> str:
|
|
112
|
+
if isinstance(item, str):
|
|
113
|
+
return item
|
|
114
|
+
if isinstance(item, dict):
|
|
115
|
+
return str(item.get("id", item.get("name", item.get("lexicon_name", ""))))
|
|
116
|
+
return str(item)
|
|
117
|
+
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"""Generic stack signal detection from common project manifests."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from collections.abc import Callable, Iterable, Mapping
|
|
6
|
+
from dataclasses import dataclass
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
from pathlib import Path
|
|
10
|
+
from typing import Any
|
|
11
|
+
|
|
12
|
+
try: # pragma: no cover - Python 3.10 fallback.
|
|
13
|
+
import tomllib
|
|
14
|
+
except ModuleNotFoundError: # pragma: no cover
|
|
15
|
+
import tomli as tomllib # type: ignore[no-redef]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass(frozen=True)
|
|
19
|
+
class StackDetection:
|
|
20
|
+
detected_signals: list[str]
|
|
21
|
+
stack_hints: list[str]
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class StackDetector:
|
|
25
|
+
"""Detect package-manager signals without encoding product knowledge."""
|
|
26
|
+
|
|
27
|
+
def detect(self, project_root: Path) -> StackDetection:
|
|
28
|
+
root = Path(project_root)
|
|
29
|
+
signals: list[str] = []
|
|
30
|
+
hints: list[str] = []
|
|
31
|
+
for name, extractor in _MANIFEST_EXTRACTORS.items():
|
|
32
|
+
path = root / name
|
|
33
|
+
if not path.is_file():
|
|
34
|
+
continue
|
|
35
|
+
signals.append(name)
|
|
36
|
+
hints.extend(extractor(path))
|
|
37
|
+
return StackDetection(detected_signals=signals, stack_hints=_unique(hints))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def _package_json(path: Path) -> Iterable[str]:
|
|
41
|
+
data = _load_json_mapping(path)
|
|
42
|
+
for key in ("dependencies", "devDependencies", "peerDependencies", "optionalDependencies"):
|
|
43
|
+
yield from _mapping_keys(data.get(key))
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _composer_json(path: Path) -> Iterable[str]:
|
|
47
|
+
data = _load_json_mapping(path)
|
|
48
|
+
for key in ("require", "require-dev"):
|
|
49
|
+
yield from _mapping_keys(data.get(key))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _requirements_txt(path: Path) -> Iterable[str]:
|
|
53
|
+
for raw_line in path.read_text(encoding="utf-8").splitlines():
|
|
54
|
+
line = raw_line.split("#", 1)[0].strip()
|
|
55
|
+
if not line or line.startswith(("-", "git+", "http://", "https://")):
|
|
56
|
+
egg = re.search(r"(?:^|[&#])egg=([A-Za-z0-9_.-]+)", raw_line)
|
|
57
|
+
if egg:
|
|
58
|
+
yield egg.group(1)
|
|
59
|
+
continue
|
|
60
|
+
match = re.match(r"([A-Za-z0-9_.-]+)", line)
|
|
61
|
+
if match:
|
|
62
|
+
yield match.group(1)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def _pyproject_toml(path: Path) -> Iterable[str]:
|
|
66
|
+
data = _load_toml_mapping(path)
|
|
67
|
+
project = data.get("project", {})
|
|
68
|
+
if isinstance(project, Mapping):
|
|
69
|
+
for item in _as_list(project.get("dependencies")):
|
|
70
|
+
yield from _requirement_name(item)
|
|
71
|
+
for group in _mapping_values(project.get("optional-dependencies")):
|
|
72
|
+
for item in _as_list(group):
|
|
73
|
+
yield from _requirement_name(item)
|
|
74
|
+
tool = data.get("tool", {})
|
|
75
|
+
if isinstance(tool, Mapping):
|
|
76
|
+
poetry = tool.get("poetry", {})
|
|
77
|
+
if isinstance(poetry, Mapping):
|
|
78
|
+
yield from _mapping_keys(poetry.get("dependencies"), exclude={"python"})
|
|
79
|
+
yield from _mapping_keys(poetry.get("dev-dependencies"), exclude={"python"})
|
|
80
|
+
for group in _mapping_values(data.get("dependency-groups")):
|
|
81
|
+
for item in _as_list(group):
|
|
82
|
+
yield from _requirement_name(item)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _go_mod(path: Path) -> Iterable[str]:
|
|
86
|
+
for line in path.read_text(encoding="utf-8").splitlines():
|
|
87
|
+
stripped = line.strip()
|
|
88
|
+
if not stripped or stripped.startswith(("//", "module ", ")")):
|
|
89
|
+
continue
|
|
90
|
+
if stripped.startswith("require "):
|
|
91
|
+
stripped = stripped.removeprefix("require ").strip()
|
|
92
|
+
name = stripped.split()[0] if stripped.split() else ""
|
|
93
|
+
if "/" in name:
|
|
94
|
+
yield name
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _cargo_toml(path: Path) -> Iterable[str]:
|
|
98
|
+
data = _load_toml_mapping(path)
|
|
99
|
+
for key in ("dependencies", "dev-dependencies", "build-dependencies"):
|
|
100
|
+
yield from _mapping_keys(data.get(key))
|
|
101
|
+
workspace = data.get("workspace", {})
|
|
102
|
+
if isinstance(workspace, Mapping):
|
|
103
|
+
yield from _mapping_keys(workspace.get("dependencies"))
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def _gemfile(path: Path) -> Iterable[str]:
|
|
107
|
+
for match in re.finditer(r"\bgem\s+['\"]([^'\"]+)['\"]", path.read_text(encoding="utf-8")):
|
|
108
|
+
yield match.group(1)
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
def _pom_xml(path: Path) -> Iterable[str]:
|
|
112
|
+
for match in re.finditer(r"<artifactId>\s*([^<\s]+)\s*</artifactId>", path.read_text(encoding="utf-8")):
|
|
113
|
+
yield match.group(1)
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
def _load_json_mapping(path: Path) -> Mapping[str, Any]:
|
|
117
|
+
data = json.loads(path.read_text(encoding="utf-8"))
|
|
118
|
+
return data if isinstance(data, Mapping) else {}
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
def _load_toml_mapping(path: Path) -> Mapping[str, Any]:
|
|
122
|
+
data = tomllib.loads(path.read_text(encoding="utf-8"))
|
|
123
|
+
return data if isinstance(data, Mapping) else {}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
def _mapping_keys(value: Any, *, exclude: set[str] | None = None) -> Iterable[str]:
|
|
127
|
+
if not isinstance(value, Mapping):
|
|
128
|
+
return []
|
|
129
|
+
skipped = exclude or set()
|
|
130
|
+
return [str(key) for key in value if str(key) not in skipped]
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def _mapping_values(value: Any) -> Iterable[Any]:
|
|
134
|
+
return value.values() if isinstance(value, Mapping) else []
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
def _as_list(value: Any) -> list[Any]:
|
|
138
|
+
return value if isinstance(value, list) else []
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def _requirement_name(value: Any) -> Iterable[str]:
|
|
142
|
+
if not isinstance(value, str):
|
|
143
|
+
return []
|
|
144
|
+
match = re.match(r"\s*([A-Za-z0-9_.-]+)", value)
|
|
145
|
+
return [match.group(1)] if match else []
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
def _unique(values: Iterable[str]) -> list[str]:
|
|
149
|
+
seen: set[str] = set()
|
|
150
|
+
result: list[str] = []
|
|
151
|
+
for value in values:
|
|
152
|
+
hint = value.strip().lower()
|
|
153
|
+
if not hint or hint in seen:
|
|
154
|
+
continue
|
|
155
|
+
seen.add(hint)
|
|
156
|
+
result.append(hint)
|
|
157
|
+
return result
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
_MANIFEST_EXTRACTORS: dict[str, Callable[[Path], Iterable[str]]] = {
|
|
161
|
+
"package.json": _package_json,
|
|
162
|
+
"requirements.txt": _requirements_txt,
|
|
163
|
+
"pyproject.toml": _pyproject_toml,
|
|
164
|
+
"go.mod": _go_mod,
|
|
165
|
+
"Cargo.toml": _cargo_toml,
|
|
166
|
+
"Gemfile": _gemfile,
|
|
167
|
+
"pom.xml": _pom_xml,
|
|
168
|
+
"composer.json": _composer_json,
|
|
169
|
+
}
|
|
170
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# EU AI Act Governance Coverage Matrix
|
|
2
|
+
|
|
3
|
+
Source: Regulation (EU) 2024/1689 on artificial intelligence.
|
|
4
|
+
|
|
5
|
+
| Axis | Covered when | Implicit when | Gap when |
|
|
6
|
+
| --- | --- | --- | --- |
|
|
7
|
+
| `Classification rules for high-risk AI systems` | The AI system's risk class, Annex III relevance, and significant-risk reasoning are stated. | The material explicitly states no AI system is being placed on the market, put into service, or deployed. | AI features exist but risk class or high-risk reasoning is absent. |
|
|
8
|
+
| `Prohibited AI practices` | The design excludes or mitigates Article 5 practices such as manipulation, vulnerability exploitation, social scoring, or banned biometric uses. | The material describes non-AI automation with no AI inference or targeting. | AI behavior could intersect Article 5 but no prohibition check is stated. |
|
|
9
|
+
| `Requirements for high-risk AI systems` | Risk management, data governance, technical documentation, logging, transparency to deployers, accuracy, robustness, and cybersecurity are specified. | The system is explicitly not high-risk and the classification rationale is documented. | A high-risk or likely high-risk system lacks Section 2 requirement coverage. |
|
|
10
|
+
| `Human oversight` | Natural-person oversight, intervention, interpretation, and misuse handling are specified. | The system has no autonomous recommendation, prediction, or decision support. | AI outputs affect people but oversight is not described. |
|
|
11
|
+
| `Transparency obligations for providers and deployers of certain AI systems` | AI interaction notices, synthetic-content labeling, emotion-recognition disclosure, and deployer communications are specified where applicable. | No user-facing AI, synthetic content, or listed transparency scenario exists. | Users or affected persons may encounter AI or synthetic content without disclosure rules. |
|
|
12
|
+
| `General-purpose AI models` | GPAI scope, documentation, downstream information, copyright policy, and systemic-risk obligations are specified. | The system uses no GPAI model and does not distribute a model. | A foundation, general-purpose, or reusable model is used or provided without GPAI duties. |
|
|
13
|
+
| `Conformity assessment` | Required assessment route, internal control or notified-body path, CE/declaration artifacts, and significant-change triggers are specified. | The system is not subject to high-risk conformity assessment and that conclusion is documented. | High-risk placement, service, or major change lacks conformity assessment. |
|
|
14
|
+
| `Post-market monitoring by providers and post-market monitoring plan` | Monitoring plan, lifecycle metrics, incident capture, serious-incident reporting, and corrective action are specified. | The system is not placed on market or operated as an AI system after release. | AI system operation continues after release without monitoring or incident handling. |
|
|
15
|
+
| `Fundamental rights impact assessment for high-risk AI systems` | FRIA scope, affected groups, risks, mitigations, and deployer responsibilities are specified. | No high-risk deployer context applies and the reason is documented. | High-risk deployment by an in-scope deployer lacks fundamental-rights impact review. |
|
|
16
|
+
| `Governance at Union and national level` | AI literacy, accountable roles, competent-authority contact, market-surveillance response, and governance escalation are specified. | A non-AI internal tool has no external governance interface. | AI obligations exist but owner, literacy, or authority interface is missing. |
|
|
17
|
+
|
|
18
|
+
Reviewers should classify each axis as `covered`, `implicit`, or `gap`.
|
|
19
|
+
Findings are emitted only for `gap`.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
extends: codd/elicit/templates/elicit_prompt_L0.md
|
|
3
|
+
lexicon_name: ai_governance_eu_act
|
|
4
|
+
observation_dimensions: 10
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# EU AI Act Governance Observation Dimensions
|
|
8
|
+
|
|
9
|
+
Apply the base elicitation prompt, then inspect requirements and design notes
|
|
10
|
+
through these EU AI Act dimensions:
|
|
11
|
+
|
|
12
|
+
1. `Classification rules for high-risk AI systems`
|
|
13
|
+
2. `Prohibited AI practices`
|
|
14
|
+
3. `Requirements for high-risk AI systems`
|
|
15
|
+
4. `Human oversight`
|
|
16
|
+
5. `Transparency obligations for providers and deployers of certain AI systems`
|
|
17
|
+
6. `General-purpose AI models`
|
|
18
|
+
7. `Conformity assessment`
|
|
19
|
+
8. `Post-market monitoring by providers and post-market monitoring plan`
|
|
20
|
+
9. `Fundamental rights impact assessment for high-risk AI systems`
|
|
21
|
+
10. `Governance at Union and national level`
|
|
22
|
+
|
|
23
|
+
For each dimension, classify coverage as:
|
|
24
|
+
|
|
25
|
+
- `covered`: requirements explicitly state the EU AI Act obligation, risk class,
|
|
26
|
+
workflow, evidence artifact, or documented non-applicability.
|
|
27
|
+
- `implicit`: the described feature is not an AI system, not high-risk, not GPAI,
|
|
28
|
+
or not in the relevant provider/deployer context, and the non-applicability is
|
|
29
|
+
clear from the material.
|
|
30
|
+
- `gap`: AI functionality exists and the dimension can affect legality,
|
|
31
|
+
fundamental rights, safety, transparency, or lifecycle controls.
|
|
32
|
+
|
|
33
|
+
Emit findings only for dimensions classified as `gap`. Include the dimension in
|
|
34
|
+
`details.dimension`, the AI feature or omission signal in `details.evidence`,
|
|
35
|
+
and a reviewer-facing question in `question`.
|
|
36
|
+
|
|
37
|
+
## Coverage-check examples
|
|
38
|
+
|
|
39
|
+
- `covered`: A hiring-screening AI design states Annex III high-risk
|
|
40
|
+
classification, Article 5 exclusion checks, risk management, training-data
|
|
41
|
+
governance, human reviewer workflow, FRIA, conformity assessment, and
|
|
42
|
+
post-market monitoring; classify the high-risk dimensions as `covered`.
|
|
43
|
+
- `implicit`: A deterministic invoice-number formatter uses no model,
|
|
44
|
+
inference, profiling, or generated content; classify the AI Act dimensions as
|
|
45
|
+
`implicit`.
|
|
46
|
+
- `gap`: A chatbot generates user-facing legal guidance with a general-purpose
|
|
47
|
+
model but lacks AI disclosure, model documentation, risk classification, and
|
|
48
|
+
monitoring; classify `Transparency obligations for providers and deployers of
|
|
49
|
+
certain AI systems`, `General-purpose AI models`, `Classification rules for
|
|
50
|
+
high-risk AI systems`, and `Post-market monitoring by providers and
|
|
51
|
+
post-market monitoring plan` as `gap`.
|
|
52
|
+
|
|
53
|
+
Use recommended kinds as guidance. Do not invent dimensions outside the ten
|
|
54
|
+
listed above.
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
coverage_axes:
|
|
2
|
+
- axis_type: "Classification rules for high-risk AI systems"
|
|
3
|
+
rationale: "EU AI Act Article 6 defines classification rules for high-risk AI systems and Annex III categories."
|
|
4
|
+
criticality_default: critical
|
|
5
|
+
variants:
|
|
6
|
+
- id: "high-risk AI system"
|
|
7
|
+
label: "High-risk AI system classification"
|
|
8
|
+
attributes: {source: "Article 6", source_literal: "high-risk AI system"}
|
|
9
|
+
criticality: critical
|
|
10
|
+
- id: "Annex III"
|
|
11
|
+
label: "Annex III high-risk area"
|
|
12
|
+
attributes: {source: "Article 6(2)", source_literal: "Annex III"}
|
|
13
|
+
criticality: critical
|
|
14
|
+
- id: "significant risk"
|
|
15
|
+
label: "Significant-risk assessment"
|
|
16
|
+
attributes: {source: "Article 6(3)", source_literal: "significant risk"}
|
|
17
|
+
criticality: high
|
|
18
|
+
- axis_type: "Prohibited AI practices"
|
|
19
|
+
rationale: "EU AI Act Chapter II Article 5 lists prohibited AI practices."
|
|
20
|
+
criticality_default: critical
|
|
21
|
+
variants:
|
|
22
|
+
- id: "subliminal techniques"
|
|
23
|
+
label: "Subliminal, manipulative, or deceptive techniques"
|
|
24
|
+
attributes: {source: "Article 5(1)(a)", source_literal: "subliminal techniques"}
|
|
25
|
+
criticality: critical
|
|
26
|
+
- id: "exploits any of the vulnerabilities"
|
|
27
|
+
label: "Exploitation of vulnerabilities"
|
|
28
|
+
attributes: {source: "Article 5(1)(b)", source_literal: "vulnerabilities"}
|
|
29
|
+
criticality: critical
|
|
30
|
+
- id: "social score"
|
|
31
|
+
label: "Social scoring"
|
|
32
|
+
attributes: {source: "Article 5(1)(c)", source_literal: "social score"}
|
|
33
|
+
criticality: critical
|
|
34
|
+
- id: "real-time remote biometric identification"
|
|
35
|
+
label: "Real-time remote biometric identification"
|
|
36
|
+
attributes: {source: "Article 5(1)(h)", source_literal: "real-time remote biometric identification"}
|
|
37
|
+
criticality: critical
|
|
38
|
+
- axis_type: "Requirements for high-risk AI systems"
|
|
39
|
+
rationale: "EU AI Act Section 2 Articles 8 to 15 sets requirements for high-risk AI systems."
|
|
40
|
+
criticality_default: high
|
|
41
|
+
variants:
|
|
42
|
+
- id: "risk management system"
|
|
43
|
+
label: "Risk management system"
|
|
44
|
+
attributes: {source: "Article 9", source_literal: "risk management system"}
|
|
45
|
+
criticality: high
|
|
46
|
+
- id: "data and data governance"
|
|
47
|
+
label: "Data and data governance"
|
|
48
|
+
attributes: {source: "Article 10", source_literal: "data governance"}
|
|
49
|
+
criticality: high
|
|
50
|
+
- id: "technical documentation"
|
|
51
|
+
label: "Technical documentation"
|
|
52
|
+
attributes: {source: "Article 11", source_literal: "technical documentation"}
|
|
53
|
+
criticality: high
|
|
54
|
+
- id: "record-keeping"
|
|
55
|
+
label: "Automatic logging and record-keeping"
|
|
56
|
+
attributes: {source: "Article 12", source_literal: "record-keeping"}
|
|
57
|
+
criticality: medium
|
|
58
|
+
- id: "accuracy, robustness and cybersecurity"
|
|
59
|
+
label: "Accuracy, robustness, and cybersecurity"
|
|
60
|
+
attributes: {source: "Article 15", source_literal: "accuracy, robustness and cybersecurity"}
|
|
61
|
+
criticality: high
|
|
62
|
+
- axis_type: "Human oversight"
|
|
63
|
+
rationale: "EU AI Act Article 14 requires high-risk AI systems to be designed for effective oversight by natural persons."
|
|
64
|
+
criticality_default: high
|
|
65
|
+
variants:
|
|
66
|
+
- id: "human oversight"
|
|
67
|
+
label: "Human oversight"
|
|
68
|
+
attributes: {source: "Article 14", source_literal: "human oversight"}
|
|
69
|
+
criticality: high
|
|
70
|
+
- id: "human-machine interface tools"
|
|
71
|
+
label: "Human-machine interface support"
|
|
72
|
+
attributes: {source: "Article 14(1)", source_literal: "human-machine interface tools"}
|
|
73
|
+
criticality: medium
|
|
74
|
+
- id: "reasonably foreseeable misuse"
|
|
75
|
+
label: "Misuse risk oversight"
|
|
76
|
+
attributes: {source: "Article 14(2)", source_literal: "reasonably foreseeable misuse"}
|
|
77
|
+
criticality: high
|
|
78
|
+
- axis_type: "Transparency obligations for providers and deployers of certain AI systems"
|
|
79
|
+
rationale: "EU AI Act Article 50 defines transparency obligations for specified provider and deployer scenarios."
|
|
80
|
+
criticality_default: high
|
|
81
|
+
variants:
|
|
82
|
+
- id: "transparency obligations"
|
|
83
|
+
label: "Article 50 transparency obligations"
|
|
84
|
+
attributes: {source: "Article 50", source_literal: "transparency obligations"}
|
|
85
|
+
criticality: high
|
|
86
|
+
- id: "synthetic audio, image, video or text content"
|
|
87
|
+
label: "Synthetic content disclosure"
|
|
88
|
+
attributes: {source: "Article 50", source_literal: "synthetic audio, image, video or text content"}
|
|
89
|
+
criticality: high
|
|
90
|
+
- id: "emotion recognition system"
|
|
91
|
+
label: "Emotion recognition transparency"
|
|
92
|
+
attributes: {source: "Article 50", source_literal: "emotion recognition system"}
|
|
93
|
+
criticality: medium
|
|
94
|
+
- axis_type: "General-purpose AI models"
|
|
95
|
+
rationale: "EU AI Act Chapter V and Articles 53 to 55 define obligations for providers of general-purpose AI models."
|
|
96
|
+
criticality_default: high
|
|
97
|
+
variants:
|
|
98
|
+
- id: "general-purpose AI model"
|
|
99
|
+
label: "GPAI model scope"
|
|
100
|
+
attributes: {source: "Chapter V", source_literal: "general-purpose AI model"}
|
|
101
|
+
criticality: high
|
|
102
|
+
- id: "technical documentation"
|
|
103
|
+
label: "GPAI technical documentation"
|
|
104
|
+
attributes: {source: "Article 53(1)(a)", source_literal: "technical documentation"}
|
|
105
|
+
criticality: high
|
|
106
|
+
- id: "systemic risk"
|
|
107
|
+
label: "Systemic-risk GPAI model"
|
|
108
|
+
attributes: {source: "Article 55", source_literal: "systemic risk"}
|
|
109
|
+
criticality: critical
|
|
110
|
+
- axis_type: "Conformity assessment"
|
|
111
|
+
rationale: "EU AI Act Article 43 requires conformity assessment before placing certain high-risk AI systems on the market or putting them into service."
|
|
112
|
+
criticality_default: high
|
|
113
|
+
variants:
|
|
114
|
+
- id: "conformity assessment"
|
|
115
|
+
label: "Conformity assessment procedure"
|
|
116
|
+
attributes: {source: "Article 43", source_literal: "conformity assessment"}
|
|
117
|
+
criticality: high
|
|
118
|
+
- id: "internal control"
|
|
119
|
+
label: "Internal control route"
|
|
120
|
+
attributes: {source: "Article 43 / Annex VI", source_literal: "internal control"}
|
|
121
|
+
criticality: medium
|
|
122
|
+
- id: "EU declaration of conformity"
|
|
123
|
+
label: "EU declaration of conformity"
|
|
124
|
+
attributes: {source: "Article 47", source_literal: "EU declaration of conformity"}
|
|
125
|
+
criticality: medium
|
|
126
|
+
- axis_type: "Post-market monitoring by providers and post-market monitoring plan"
|
|
127
|
+
rationale: "EU AI Act Article 72 requires providers to establish and document post-market monitoring for high-risk AI systems."
|
|
128
|
+
criticality_default: high
|
|
129
|
+
variants:
|
|
130
|
+
- id: "post-market monitoring"
|
|
131
|
+
label: "Post-market monitoring"
|
|
132
|
+
attributes: {source: "Article 72", source_literal: "post-market monitoring"}
|
|
133
|
+
criticality: high
|
|
134
|
+
- id: "post-market monitoring plan"
|
|
135
|
+
label: "Post-market monitoring plan"
|
|
136
|
+
attributes: {source: "Article 72", source_literal: "post-market monitoring plan"}
|
|
137
|
+
criticality: high
|
|
138
|
+
- id: "serious incident"
|
|
139
|
+
label: "Serious incident handling"
|
|
140
|
+
attributes: {source: "Article 73", source_literal: "serious incident"}
|
|
141
|
+
criticality: critical
|
|
142
|
+
- axis_type: "Fundamental rights impact assessment for high-risk AI systems"
|
|
143
|
+
rationale: "EU AI Act Article 27 requires specified deployers to carry out a fundamental rights impact assessment before using high-risk AI systems."
|
|
144
|
+
criticality_default: high
|
|
145
|
+
variants:
|
|
146
|
+
- id: "fundamental rights impact assessment"
|
|
147
|
+
label: "FRIA requirement"
|
|
148
|
+
attributes: {source: "Article 27", acronym: "FRIA"}
|
|
149
|
+
criticality: high
|
|
150
|
+
- id: "deployers of high-risk AI systems"
|
|
151
|
+
label: "Deployer FRIA scope"
|
|
152
|
+
attributes: {source: "Article 27", source_literal: "deployers of high-risk AI systems"}
|
|
153
|
+
criticality: high
|
|
154
|
+
- id: "risks to fundamental rights"
|
|
155
|
+
label: "Fundamental-rights risk identification"
|
|
156
|
+
attributes: {source: "Article 27", source_literal: "risks to fundamental rights"}
|
|
157
|
+
criticality: high
|
|
158
|
+
- axis_type: "Governance at Union and national level"
|
|
159
|
+
rationale: "EU AI Act Chapter VII establishes governance bodies, national competent authorities, market surveillance, and AI literacy expectations."
|
|
160
|
+
criticality_default: medium
|
|
161
|
+
variants:
|
|
162
|
+
- id: "AI Office"
|
|
163
|
+
label: "AI Office governance"
|
|
164
|
+
attributes: {source: "Chapter VII", source_literal: "AI Office"}
|
|
165
|
+
criticality: medium
|
|
166
|
+
- id: "European Artificial Intelligence Board"
|
|
167
|
+
label: "European AI Board governance"
|
|
168
|
+
attributes: {source: "Chapter VII", source_literal: "European Artificial Intelligence Board"}
|
|
169
|
+
criticality: medium
|
|
170
|
+
- id: "national competent authorities"
|
|
171
|
+
label: "National competent authority interface"
|
|
172
|
+
attributes: {source: "Chapter VII", source_literal: "national competent authorities"}
|
|
173
|
+
criticality: medium
|
|
174
|
+
- id: "AI literacy"
|
|
175
|
+
label: "AI literacy measures"
|
|
176
|
+
attributes: {source: "Article 4", source_literal: "AI literacy"}
|
|
177
|
+
criticality: medium
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
name: ai_governance_eu_act
|
|
2
|
+
lexicon_name: ai_governance_eu_act
|
|
3
|
+
version: "1.0.0"
|
|
4
|
+
source_url: "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1689"
|
|
5
|
+
source_version: "Regulation (EU) 2024/1689, Official Journal 2024-07-12"
|
|
6
|
+
description: "EU AI Act governance coverage axes for AI systems, high-risk systems, GPAI, and deployer obligations."
|
|
7
|
+
observation_dimensions: 10
|
|
8
|
+
extends: "codd/elicit/templates/elicit_prompt_L0.md"
|
|
9
|
+
prompt_extension: "elicit_extend.md"
|
|
10
|
+
recommended_kinds: "recommended_kinds.yaml"
|
|
11
|
+
lexicon: "lexicon.yaml"
|
|
12
|
+
severity_rules: "severity_rules.yaml"
|
|
13
|
+
coverage_matrix: "coverage_matrix.md"
|
|
14
|
+
references:
|
|
15
|
+
- title: "Regulation (EU) 2024/1689 on artificial intelligence"
|
|
16
|
+
url: "https://eur-lex.europa.eu/eli/reg/2024/1689/oj"
|
|
17
|
+
- title: "EUR-Lex CELEX 32024R1689"
|
|
18
|
+
url: "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32024R1689"
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
recommended_kinds:
|
|
2
|
+
- ai_risk_classification_gap
|
|
3
|
+
- prohibited_ai_practice_gap
|
|
4
|
+
- high_risk_requirement_gap
|
|
5
|
+
- human_oversight_gap
|
|
6
|
+
- ai_transparency_gap
|
|
7
|
+
- gpai_obligation_gap
|
|
8
|
+
- conformity_assessment_gap
|
|
9
|
+
- post_market_monitoring_gap
|
|
10
|
+
- fundamental_rights_impact_gap
|
|
11
|
+
- ai_governance_authority_gap
|