codd-dev 2.47.0__tar.gz → 2.48.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-2.47.0 → codd_dev-2.48.0}/PKG-INFO +1 -1
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/__init__.py +1 -1
- codd_dev-2.48.0/codd/e2e_harness.py +291 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/vb_marker_authenticity.py +119 -2
- {codd_dev-2.47.0 → codd_dev-2.48.0}/pyproject.toml +1 -1
- codd_dev-2.47.0/codd/e2e_harness.py +0 -177
- {codd_dev-2.47.0 → codd_dev-2.48.0}/.gitignore +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/LICENSE +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/bench_fixture/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/__main__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/action_outcome.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/ai_invoke.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/ai_patch.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/artifact_contract.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/artifact_ids.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/assembler.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/bridge.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/capability_completeness.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/claude_cli.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/cli.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/clustering.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/confidence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/config.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/config_schema.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/impact.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/defaults.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployer.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/design_md.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/discovery.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/drift.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/env_refs.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/extract_paths.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/extractor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixer.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/frontmatter.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/generator.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/git_evidence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/graph.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/greenfield/pipeline.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/iac_nfr.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implement_oracle.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/implementer.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/import_coherence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/inheritance.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/measure.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/operations_derive.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/iac.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/planner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/policy.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/project_types.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/propagate.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/propagation_common.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/propagator.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/reference_resolution.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/registry.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/history.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/require.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/requirements_meta.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/restoration_report.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/restore.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/scanner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/synth.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/test_detection.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/traceability.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/validator.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/events.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd/wiring.py +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/dogfood/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/examples/README.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.0}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-2.47.0 → codd_dev-2.48.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: 2.
|
|
3
|
+
Version: 2.48.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
|
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
"""Deterministic web/HTTP end-to-end harness selection (language-aware).
|
|
2
|
+
|
|
3
|
+
Historically CoDD's generation pipeline selected a browser E2E harness
|
|
4
|
+
(Playwright/TypeScript ``*.spec.ts``) for ANY project whose capability profile
|
|
5
|
+
declared ``e2e_modality == "browser"`` — regardless of the project's host
|
|
6
|
+
language. A Python Flask web app with an HTTP surface and no node toolchain
|
|
7
|
+
therefore honest-failed at verify time with ``Cannot find module
|
|
8
|
+
'@playwright/test'``: CoDD chose a TS/node verification harness it had no way to
|
|
9
|
+
run. The CLI branch was already language-native ("invoke the built CLI as a
|
|
10
|
+
subprocess; do NOT use Playwright"); the web branch was not.
|
|
11
|
+
|
|
12
|
+
This module is the single, DETERMINISTIC decision point that makes web/HTTP E2E
|
|
13
|
+
harness selection language-aware, mirroring the CLI branch. The rules below are
|
|
14
|
+
pure functions of ``project_language`` + ``capabilities`` (+ explicit
|
|
15
|
+
``constraints``); they NEVER infer intent from LLM prose.
|
|
16
|
+
|
|
17
|
+
Anti-false-green contract (the load-bearing rule). The Python HTTP downgrade for
|
|
18
|
+
a ``browser``-modality project is gated on POSITIVE, structured evidence that
|
|
19
|
+
HTTP-contract testing SUFFICES — never on the ABSENCE of a browser flag. An
|
|
20
|
+
earlier revision downgraded any Python browser-modality project that lacked an
|
|
21
|
+
explicit browser flag to ``pytest_http``; that was itself a false-GREEN, because
|
|
22
|
+
a Python web app whose UI/DOM/JS need was expressed only in design PROSE (and not
|
|
23
|
+
mirrored into structured constraints) silently got an HTTP-only harness and real
|
|
24
|
+
browser evidence was NEVER captured. The browser branch now classifies the
|
|
25
|
+
project three ways (:func:`_http_sufficiency`): an explicit browser flag/selector
|
|
26
|
+
or a ``user_interface`` capability → the real browser harness; a POSITIVE
|
|
27
|
+
http-sufficiency opt-in → ``pytest_http`` for Python; and ``unknown`` (no positive
|
|
28
|
+
signal either way) FAILS CLOSED to the browser harness. The worst case for an
|
|
29
|
+
ambiguous browser project is therefore a false-RED / explicit node-toolchain
|
|
30
|
+
requirement (an honest fail), NEVER a silent false-GREEN.
|
|
31
|
+
|
|
32
|
+
The matrix is generic (host-language × modality), not Python+Playwright
|
|
33
|
+
special-cased: TypeScript/node browser projects keep the existing Playwright
|
|
34
|
+
path BYTE-FOR-BYTE; a non-Python HTTP surface keeps today's behavior.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
from __future__ import annotations
|
|
38
|
+
|
|
39
|
+
from collections.abc import Mapping
|
|
40
|
+
from dataclasses import dataclass
|
|
41
|
+
from typing import Any, Literal
|
|
42
|
+
|
|
43
|
+
from codd.project_types import ProjectCapabilities
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
__all__ = ["E2EHarnessSpec", "resolve_e2e_harness"]
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
#: Config/constraint keys whose VALUE explicitly selects a node/Playwright
|
|
50
|
+
#: browser-automation harness. Matching is exact (lower-cased) — prose is never
|
|
51
|
+
#: parsed. Keeping this a small allow-list (rather than a substring scan) is what
|
|
52
|
+
#: keeps the resolver deterministic and free of LLM-inference.
|
|
53
|
+
_EXPLICIT_BROWSER_HARNESS_VALUES = frozenset(
|
|
54
|
+
{"playwright", "playwright_node", "cypress", "browser", "node"}
|
|
55
|
+
)
|
|
56
|
+
|
|
57
|
+
#: Constraint keys that, when truthy, declare browser automation is required.
|
|
58
|
+
_EXPLICIT_BROWSER_FLAG_KEYS = frozenset(
|
|
59
|
+
{"browser_automation_required", "requires_browser", "browser_required"}
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
#: Constraint keys whose value is read as an explicit harness selector.
|
|
63
|
+
_E2E_HARNESS_SELECTOR_KEYS = frozenset({"e2e_harness", "e2e_runner", "harness"})
|
|
64
|
+
|
|
65
|
+
#: Constraint keys that, when truthy, are a POSITIVE, structured declaration that
|
|
66
|
+
#: HTTP-contract E2E testing is SUFFICIENT for this browser-modality project
|
|
67
|
+
#: (i.e. no real-browser/DOM evidence is required — a headless API surface that
|
|
68
|
+
#: happens to share the ``browser`` profile). This is the ONLY positive signal
|
|
69
|
+
#: that authorises the language-native ``pytest_http`` downgrade for a Python
|
|
70
|
+
#: browser-modality project. Matching is exact (lower-cased); prose is NEVER
|
|
71
|
+
#: parsed. Absence of this key is NOT a downgrade signal — see
|
|
72
|
+
#: :func:`_http_sufficiency` (``unknown`` fails CLOSED toward the browser harness).
|
|
73
|
+
_EXPLICIT_HTTP_SUFFICIENCY_FLAG_KEYS = frozenset(
|
|
74
|
+
{"http_contract_sufficient", "http_e2e_sufficient", "no_browser_required"}
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
#: Harness-selector VALUES that explicitly select the Python HTTP-contract
|
|
78
|
+
#: harness (the positive mirror of ``_EXPLICIT_BROWSER_HARNESS_VALUES``). An
|
|
79
|
+
#: owner who writes ``e2e_harness: pytest_http`` is positively declaring HTTP
|
|
80
|
+
#: suffices, just as ``e2e_harness: playwright`` positively declares the browser.
|
|
81
|
+
_EXPLICIT_HTTP_HARNESS_VALUES = frozenset({"pytest_http", "http", "pytest"})
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
@dataclass(frozen=True)
|
|
85
|
+
class E2EHarnessSpec:
|
|
86
|
+
"""The resolved web/HTTP E2E harness for a project.
|
|
87
|
+
|
|
88
|
+
``runner`` — logical runner id (``pytest_http`` | ``playwright`` |
|
|
89
|
+
``native_cli`` | ``none``).
|
|
90
|
+
``language`` — host language the generated tests are written in.
|
|
91
|
+
``output_ext``— file extension for generated E2E test files (``.py`` | ``.ts``).
|
|
92
|
+
``template_ref`` — the verification template the extractor/verify layer
|
|
93
|
+
routes this harness to (``pytest_http`` | ``playwright`` |
|
|
94
|
+
``native_cli`` | ``none``).
|
|
95
|
+
``requires_node_manifest`` — True when the harness needs a node manifest
|
|
96
|
+
(``package.json``) to run (Playwright). Consumed by the
|
|
97
|
+
conditional node-manifest scaffold (deferred) and the
|
|
98
|
+
toolchain-coherence gate; never inferred from prose.
|
|
99
|
+
"""
|
|
100
|
+
|
|
101
|
+
runner: str
|
|
102
|
+
language: str
|
|
103
|
+
output_ext: str
|
|
104
|
+
template_ref: str
|
|
105
|
+
requires_node_manifest: bool = False
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def _explicit_browser_required(constraints: Mapping[str, Any] | None) -> bool:
|
|
109
|
+
"""True ONLY when constraints/config EXPLICITLY declare browser automation.
|
|
110
|
+
|
|
111
|
+
Deterministic: a truthy boolean flag key (e.g. ``browser_automation_required:
|
|
112
|
+
true``) OR a harness-selector key whose value names a browser/node runner
|
|
113
|
+
(e.g. ``e2e_harness: playwright_node``). Ambiguous/absent → False. This is the
|
|
114
|
+
``browser_ui_required`` arm of :func:`_http_sufficiency`; absence is NOT a
|
|
115
|
+
downgrade signal (the ``unknown`` arm fails CLOSED to the browser harness, so a
|
|
116
|
+
missing flag never silently loses browser evidence). LLM prose is NEVER parsed.
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
if not isinstance(constraints, Mapping):
|
|
120
|
+
return False
|
|
121
|
+
|
|
122
|
+
for key, value in constraints.items():
|
|
123
|
+
if not isinstance(key, str):
|
|
124
|
+
continue
|
|
125
|
+
normalized_key = key.strip().lower()
|
|
126
|
+
if normalized_key in _EXPLICIT_BROWSER_FLAG_KEYS and bool(value):
|
|
127
|
+
return True
|
|
128
|
+
if normalized_key in _E2E_HARNESS_SELECTOR_KEYS and isinstance(value, str):
|
|
129
|
+
if value.strip().lower() in _EXPLICIT_BROWSER_HARNESS_VALUES:
|
|
130
|
+
return True
|
|
131
|
+
return False
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def _explicit_http_sufficiency(constraints: Mapping[str, Any] | None) -> bool:
|
|
135
|
+
"""True ONLY when constraints/config POSITIVELY declare HTTP E2E suffices.
|
|
136
|
+
|
|
137
|
+
Deterministic, structured-only mirror of :func:`_explicit_browser_required`:
|
|
138
|
+
a truthy boolean flag key (e.g. ``http_contract_sufficient: true``) OR a
|
|
139
|
+
harness-selector key whose value names the Python HTTP harness (e.g.
|
|
140
|
+
``e2e_harness: pytest_http``). This is a POSITIVE opt-in — the owner is
|
|
141
|
+
explicitly stating no real-browser/DOM evidence is required. Ambiguous/absent
|
|
142
|
+
→ False. LLM prose is NEVER parsed.
|
|
143
|
+
"""
|
|
144
|
+
|
|
145
|
+
if not isinstance(constraints, Mapping):
|
|
146
|
+
return False
|
|
147
|
+
|
|
148
|
+
for key, value in constraints.items():
|
|
149
|
+
if not isinstance(key, str):
|
|
150
|
+
continue
|
|
151
|
+
normalized_key = key.strip().lower()
|
|
152
|
+
if normalized_key in _EXPLICIT_HTTP_SUFFICIENCY_FLAG_KEYS and bool(value):
|
|
153
|
+
return True
|
|
154
|
+
if normalized_key in _E2E_HARNESS_SELECTOR_KEYS and isinstance(value, str):
|
|
155
|
+
if value.strip().lower() in _EXPLICIT_HTTP_HARNESS_VALUES:
|
|
156
|
+
return True
|
|
157
|
+
return False
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def _http_sufficiency(
|
|
161
|
+
constraints: Mapping[str, Any] | None,
|
|
162
|
+
capabilities: ProjectCapabilities,
|
|
163
|
+
) -> Literal["browser_ui_required", "http_contract_sufficient", "unknown"]:
|
|
164
|
+
"""Classify a BROWSER-modality project from POSITIVE, structured evidence only.
|
|
165
|
+
|
|
166
|
+
The decision is driven by POSITIVE evidence, never by the ABSENCE of a flag
|
|
167
|
+
(the historical false-GREEN: a Python web app whose UI/DOM need lived only in
|
|
168
|
+
design PROSE was silently downgraded to HTTP-only ``pytest_http``, so real
|
|
169
|
+
browser evidence was never captured). Three outcomes, in precedence order:
|
|
170
|
+
|
|
171
|
+
* ``browser_ui_required`` — an explicit browser flag/harness-selector
|
|
172
|
+
(:func:`_explicit_browser_required`), OR the structured capability signal
|
|
173
|
+
that a user interface is required (``capabilities.user_interface``). Routes
|
|
174
|
+
to the real browser harness (Playwright). The explicit flag has the highest
|
|
175
|
+
precedence: an owner who named a browser harness gets it unconditionally.
|
|
176
|
+
* ``http_contract_sufficient`` — a POSITIVE, structured opt-in declaring HTTP
|
|
177
|
+
E2E suffices (:func:`_explicit_http_sufficiency`): a constraint/config flag
|
|
178
|
+
or an ``e2e_harness: pytest_http`` selector. ONLY this positive signal
|
|
179
|
+
authorises the language-native HTTP downgrade for a Python project.
|
|
180
|
+
* ``unknown`` — NEITHER positive signal present. We do NOT silently downgrade;
|
|
181
|
+
the caller FAILS CLOSED toward the browser harness so browser evidence is
|
|
182
|
+
never lost (worst case a false-RED / explicit node-toolchain requirement,
|
|
183
|
+
NEVER a silent false-GREEN).
|
|
184
|
+
|
|
185
|
+
Reads ONLY structured/positive evidence (constraints + the capability
|
|
186
|
+
profile). Prose / LLM inference is never consulted.
|
|
187
|
+
"""
|
|
188
|
+
|
|
189
|
+
# Explicit browser flag/selector wins outright (strongest explicit signal).
|
|
190
|
+
if _explicit_browser_required(constraints):
|
|
191
|
+
return "browser_ui_required"
|
|
192
|
+
# Positive HTTP-sufficiency opt-in is the ONLY authorised downgrade signal;
|
|
193
|
+
# it is checked before the UI-required capability so an owner can declare an
|
|
194
|
+
# HTTP-only contract for a profile that nominally carries ``user_interface``.
|
|
195
|
+
if _explicit_http_sufficiency(constraints):
|
|
196
|
+
return "http_contract_sufficient"
|
|
197
|
+
# A structured "UI is required" capability is positive browser-need evidence.
|
|
198
|
+
if capabilities.user_interface:
|
|
199
|
+
return "browser_ui_required"
|
|
200
|
+
# No positive signal either way → fail closed toward the browser harness.
|
|
201
|
+
return "unknown"
|
|
202
|
+
|
|
203
|
+
|
|
204
|
+
def resolve_e2e_harness(
|
|
205
|
+
*,
|
|
206
|
+
project_language: str | None,
|
|
207
|
+
capabilities: ProjectCapabilities,
|
|
208
|
+
constraints: Mapping[str, Any] | None = None,
|
|
209
|
+
) -> E2EHarnessSpec:
|
|
210
|
+
"""Deterministically resolve the E2E harness for a project.
|
|
211
|
+
|
|
212
|
+
Rules (pure function of inputs; no prose inference):
|
|
213
|
+
|
|
214
|
+
* ``e2e_modality == "cli"`` → native CLI harness (subprocess on the built
|
|
215
|
+
CLI). Output ext follows host language (``.py`` for Python, else ``.ts``).
|
|
216
|
+
The CLI branch already works end-to-end; this is here for completeness so
|
|
217
|
+
the resolver is the single decision point.
|
|
218
|
+
* ``e2e_modality == "browser"`` → a 3-way classification from POSITIVE,
|
|
219
|
+
structured evidence (:func:`_http_sufficiency`) — NEVER from the absence of
|
|
220
|
+
a flag (the historical false-GREEN that silently dropped browser evidence):
|
|
221
|
+
- ``http_contract_sufficient`` (a POSITIVE opt-in that HTTP suffices) AND
|
|
222
|
+
Python → ``pytest_http`` / ``.py``.
|
|
223
|
+
- ``browser_ui_required`` (explicit browser flag/selector, or the
|
|
224
|
+
``user_interface`` capability) → ``playwright`` / ``.ts`` (node manifest).
|
|
225
|
+
- ``unknown`` (no positive signal) → FAIL CLOSED to ``playwright`` / ``.ts``
|
|
226
|
+
(node manifest). We never silently downgrade an unknown browser project
|
|
227
|
+
to ``pytest_http``: the worst case is a false-RED / explicit
|
|
228
|
+
node-toolchain requirement, NEVER a silent false-GREEN that loses real
|
|
229
|
+
browser/DOM evidence.
|
|
230
|
+
* non-browser HTTP surface (``network_surface == "http"``) → ``pytest_http``
|
|
231
|
+
/ ``.py`` for Python; for any other language keep today's behavior by
|
|
232
|
+
routing to the Playwright/node path (``.ts``) so generality holds.
|
|
233
|
+
* otherwise → a ``none`` spec (no E2E layer applies).
|
|
234
|
+
"""
|
|
235
|
+
|
|
236
|
+
lang = (project_language or "").strip().lower()
|
|
237
|
+
is_python = lang == "python"
|
|
238
|
+
modality = capabilities.e2e_modality
|
|
239
|
+
|
|
240
|
+
if modality == "cli":
|
|
241
|
+
return E2EHarnessSpec(
|
|
242
|
+
runner="native_cli",
|
|
243
|
+
language=lang or "python",
|
|
244
|
+
output_ext=".py" if is_python else ".ts",
|
|
245
|
+
template_ref="native_cli",
|
|
246
|
+
)
|
|
247
|
+
|
|
248
|
+
if modality == "browser":
|
|
249
|
+
classification = _http_sufficiency(constraints, capabilities)
|
|
250
|
+
# ONLY a POSITIVE http-sufficiency opt-in authorises the Python HTTP
|
|
251
|
+
# downgrade. ``browser_ui_required`` AND ``unknown`` both route to the
|
|
252
|
+
# real browser harness — ``unknown`` fails CLOSED so an undeclared
|
|
253
|
+
# browser project never silently loses DOM evidence (anti-false-green).
|
|
254
|
+
if is_python and classification == "http_contract_sufficient":
|
|
255
|
+
return E2EHarnessSpec(
|
|
256
|
+
runner="pytest_http",
|
|
257
|
+
language="python",
|
|
258
|
+
output_ext=".py",
|
|
259
|
+
template_ref="pytest_http",
|
|
260
|
+
)
|
|
261
|
+
return E2EHarnessSpec(
|
|
262
|
+
runner="playwright",
|
|
263
|
+
language="typescript",
|
|
264
|
+
output_ext=".ts",
|
|
265
|
+
template_ref="playwright",
|
|
266
|
+
requires_node_manifest=True,
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
if capabilities.network_surface == "http":
|
|
270
|
+
if is_python:
|
|
271
|
+
return E2EHarnessSpec(
|
|
272
|
+
runner="pytest_http",
|
|
273
|
+
language="python",
|
|
274
|
+
output_ext=".py",
|
|
275
|
+
template_ref="pytest_http",
|
|
276
|
+
)
|
|
277
|
+
# Non-Python HTTP surface: preserve today's TS/Playwright behavior.
|
|
278
|
+
return E2EHarnessSpec(
|
|
279
|
+
runner="playwright",
|
|
280
|
+
language=lang or "typescript",
|
|
281
|
+
output_ext=".ts",
|
|
282
|
+
template_ref="playwright",
|
|
283
|
+
requires_node_manifest=True,
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
return E2EHarnessSpec(
|
|
287
|
+
runner="none",
|
|
288
|
+
language=lang or "python",
|
|
289
|
+
output_ext=".py" if is_python else ".ts",
|
|
290
|
+
template_ref="none",
|
|
291
|
+
)
|
|
@@ -1993,6 +1993,114 @@ _ASSIGN_RE = re.compile(
|
|
|
1993
1993
|
#: Derivation hops: ``a = f(param); b = g(a); expect(b…)`` resolves with 2 passes.
|
|
1994
1994
|
_MAX_DERIVE_PASSES = 2
|
|
1995
1995
|
|
|
1996
|
+
#: An identifier token (TS/JS ``$``-bearing names and python names alike).
|
|
1997
|
+
_IDENT_RE = re.compile(r"[A-Za-z_$][\w$]*")
|
|
1998
|
+
|
|
1999
|
+
|
|
2000
|
+
def _rhs_reference_idents(rhs: str) -> set[str] | None:
|
|
2001
|
+
"""Genuine variable REFERENCES on an assignment RHS — fails CLOSED.
|
|
2002
|
+
|
|
2003
|
+
The naive ``re.findall(IDENT, rhs)`` (pre-2.48) harvested every identifier
|
|
2004
|
+
on the RHS, INCLUDING those inside string literals, comments, and object
|
|
2005
|
+
KEYS — a false-GREEN: ``const body = "response"`` (string), ``const x =
|
|
2006
|
+
{ response: 1 }`` (key), or ``const body = compute(); // response`` (comment)
|
|
2007
|
+
all wrongly marked the lhs param-derived, so a constant-only helper that
|
|
2008
|
+
merely *contains* that binding looked anchored to the call's data.
|
|
2009
|
+
|
|
2010
|
+
This is a small DETERMINISTIC char scanner (no LLM, no new deps). It returns
|
|
2011
|
+
only names that are genuine references:
|
|
2012
|
+
|
|
2013
|
+
* identifiers inside ``'…'`` / ``"…"`` / ``\\`…\\``` strings (backslash escapes
|
|
2014
|
+
honoured) and inside ``// line`` / ``/* block */`` comments are EXCLUDED;
|
|
2015
|
+
* an object-literal KEY (``{ key: … }`` — an identifier immediately followed
|
|
2016
|
+
by ``:`` while inside ``{…}``) is NOT a reference (its VALUE still is);
|
|
2017
|
+
* a PROPERTY name after a ``.`` member access (``foo.response``) is NOT an
|
|
2018
|
+
independent reference (the base ``foo`` still is).
|
|
2019
|
+
|
|
2020
|
+
Returns ``None`` when the RHS cannot be confidently scanned (an unterminated
|
|
2021
|
+
string or block comment) — the caller then declines to add the lhs to the
|
|
2022
|
+
derived set (FAIL-CLOSED ⇒ toward false-RED, never false-GREEN).
|
|
2023
|
+
"""
|
|
2024
|
+
|
|
2025
|
+
refs: set[str] = set()
|
|
2026
|
+
i = 0
|
|
2027
|
+
n = len(rhs)
|
|
2028
|
+
# Brace-depth of OBJECT LITERALS in this RHS expression: in expression
|
|
2029
|
+
# position ``{`` opens an object literal, so an ``ident :`` at depth > 0 is a
|
|
2030
|
+
# key. Tracking depth keeps a top-level ternary ``cond ? a : b`` (depth 0)
|
|
2031
|
+
# from having its branches mis-read as keys (which would only ever fail
|
|
2032
|
+
# closed, but needlessly).
|
|
2033
|
+
brace_depth = 0
|
|
2034
|
+
while i < n:
|
|
2035
|
+
ch = rhs[i]
|
|
2036
|
+
# ── string literals: skip to the matching unescaped quote ──
|
|
2037
|
+
if ch == "'" or ch == '"' or ch == "`":
|
|
2038
|
+
quote = ch
|
|
2039
|
+
i += 1
|
|
2040
|
+
closed = False
|
|
2041
|
+
while i < n:
|
|
2042
|
+
c = rhs[i]
|
|
2043
|
+
if c == "\\": # escape — skip the next char
|
|
2044
|
+
i += 2
|
|
2045
|
+
continue
|
|
2046
|
+
if c == quote:
|
|
2047
|
+
i += 1
|
|
2048
|
+
closed = True
|
|
2049
|
+
break
|
|
2050
|
+
i += 1
|
|
2051
|
+
if not closed:
|
|
2052
|
+
return None # unterminated string → cannot scan → fail closed
|
|
2053
|
+
continue
|
|
2054
|
+
# ── comments: ``// …`` to EOL, ``/* … */`` block ──
|
|
2055
|
+
if ch == "/" and i + 1 < n and rhs[i + 1] == "/":
|
|
2056
|
+
while i < n and rhs[i] != "\n":
|
|
2057
|
+
i += 1
|
|
2058
|
+
continue
|
|
2059
|
+
if ch == "/" and i + 1 < n and rhs[i + 1] == "*":
|
|
2060
|
+
end = rhs.find("*/", i + 2)
|
|
2061
|
+
if end == -1:
|
|
2062
|
+
return None # unterminated block comment → fail closed
|
|
2063
|
+
i = end + 2
|
|
2064
|
+
continue
|
|
2065
|
+
# ── object-literal brace tracking ──
|
|
2066
|
+
if ch == "{":
|
|
2067
|
+
brace_depth += 1
|
|
2068
|
+
i += 1
|
|
2069
|
+
continue
|
|
2070
|
+
if ch == "}":
|
|
2071
|
+
if brace_depth > 0:
|
|
2072
|
+
brace_depth -= 1
|
|
2073
|
+
i += 1
|
|
2074
|
+
continue
|
|
2075
|
+
# ── identifier ──
|
|
2076
|
+
if ch.isalpha() or ch == "_" or ch == "$":
|
|
2077
|
+
m = _IDENT_RE.match(rhs, i)
|
|
2078
|
+
assert m is not None # ch starts a valid identifier
|
|
2079
|
+
name = m.group(0)
|
|
2080
|
+
start, j = m.start(), m.end()
|
|
2081
|
+
# PROPERTY after a ``.`` member access? walk back over whitespace.
|
|
2082
|
+
k = start - 1
|
|
2083
|
+
while k >= 0 and rhs[k] in " \t":
|
|
2084
|
+
k -= 1
|
|
2085
|
+
is_property = k >= 0 and rhs[k] == "."
|
|
2086
|
+
# OBJECT-LITERAL KEY? immediately followed by ``:`` while inside a
|
|
2087
|
+
# ``{…}`` (and not ``::``, which is not a key separator).
|
|
2088
|
+
p = j
|
|
2089
|
+
while p < n and rhs[p] in " \t":
|
|
2090
|
+
p += 1
|
|
2091
|
+
is_key = (
|
|
2092
|
+
brace_depth > 0
|
|
2093
|
+
and p < n
|
|
2094
|
+
and rhs[p] == ":"
|
|
2095
|
+
and not (p + 1 < n and rhs[p + 1] == ":")
|
|
2096
|
+
)
|
|
2097
|
+
if not is_property and not is_key:
|
|
2098
|
+
refs.add(name)
|
|
2099
|
+
i = j
|
|
2100
|
+
continue
|
|
2101
|
+
i += 1
|
|
2102
|
+
return refs
|
|
2103
|
+
|
|
1996
2104
|
|
|
1997
2105
|
def _params_and_derived_locals(body: str, param_set: set[str]) -> set[str]:
|
|
1998
2106
|
"""``param_set`` plus locals DERIVED from a parameter within ``body`` (≤2 hops).
|
|
@@ -2007,6 +2115,13 @@ def _params_and_derived_locals(body: str, param_set: set[str]) -> set[str]:
|
|
|
2007
2115
|
Constants never enter the set (``const k = 5`` references no param), so a
|
|
2008
2116
|
constant-only helper stays unanchored ⇒ FAIL. Destructured bindings
|
|
2009
2117
|
(``const { error } = body``) add each bound name when the RHS is derived.
|
|
2118
|
+
|
|
2119
|
+
The RHS is scanned by :func:`_rhs_reference_idents`, which counts only
|
|
2120
|
+
genuine variable references: identifiers inside STRING LITERALS, COMMENTS, and
|
|
2121
|
+
object KEYS do NOT flow a param (``const body = "response"`` does not derive
|
|
2122
|
+
``body`` from a ``response`` param). When an RHS cannot be confidently scanned
|
|
2123
|
+
(unterminated string/comment) the lhs is NOT added — FAIL-CLOSED, never
|
|
2124
|
+
crediting fake coverage.
|
|
2010
2125
|
"""
|
|
2011
2126
|
|
|
2012
2127
|
if not param_set:
|
|
@@ -2015,11 +2130,13 @@ def _params_and_derived_locals(body: str, param_set: set[str]) -> set[str]:
|
|
|
2015
2130
|
for _ in range(_MAX_DERIVE_PASSES):
|
|
2016
2131
|
grew = False
|
|
2017
2132
|
for match in _ASSIGN_RE.finditer(body):
|
|
2018
|
-
rhs_idents =
|
|
2133
|
+
rhs_idents = _rhs_reference_idents(match.group("rhs"))
|
|
2134
|
+
if rhs_idents is None:
|
|
2135
|
+
continue # RHS not confidently scannable → fail closed
|
|
2019
2136
|
if not (rhs_idents & derived):
|
|
2020
2137
|
continue
|
|
2021
2138
|
lhs = match.group("destructure") or match.group("name") or ""
|
|
2022
|
-
for lhs_name in
|
|
2139
|
+
for lhs_name in _IDENT_RE.findall(lhs):
|
|
2023
2140
|
if lhs_name not in derived:
|
|
2024
2141
|
derived.add(lhs_name)
|
|
2025
2142
|
grew = True
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
"""Deterministic web/HTTP end-to-end harness selection (language-aware).
|
|
2
|
-
|
|
3
|
-
Historically CoDD's generation pipeline selected a browser E2E harness
|
|
4
|
-
(Playwright/TypeScript ``*.spec.ts``) for ANY project whose capability profile
|
|
5
|
-
declared ``e2e_modality == "browser"`` — regardless of the project's host
|
|
6
|
-
language. A Python Flask web app with an HTTP surface and no node toolchain
|
|
7
|
-
therefore honest-failed at verify time with ``Cannot find module
|
|
8
|
-
'@playwright/test'``: CoDD chose a TS/node verification harness it had no way to
|
|
9
|
-
run. The CLI branch was already language-native ("invoke the built CLI as a
|
|
10
|
-
subprocess; do NOT use Playwright"); the web branch was not.
|
|
11
|
-
|
|
12
|
-
This module is the single, DETERMINISTIC decision point that makes web/HTTP E2E
|
|
13
|
-
harness selection language-aware, mirroring the CLI branch. The rules below are
|
|
14
|
-
pure functions of ``project_language`` + ``capabilities`` (+ explicit
|
|
15
|
-
``constraints``); they NEVER infer intent from LLM prose. The North-Star
|
|
16
|
-
contract is anti-false-green-safe: when browser automation is NOT explicitly
|
|
17
|
-
required, a Python project gets a Python ``pytest`` HTTP E2E harness instead of
|
|
18
|
-
TS Playwright. The worst case of preferring HTTP E2E for an ambiguous project is
|
|
19
|
-
a false-RED / coverage gap (an honest fail), never a false-GREEN.
|
|
20
|
-
|
|
21
|
-
The matrix is generic (host-language × modality), not Python+Playwright
|
|
22
|
-
special-cased: TypeScript/node browser projects keep the existing Playwright
|
|
23
|
-
path BYTE-FOR-BYTE; a non-Python HTTP surface keeps today's behavior.
|
|
24
|
-
"""
|
|
25
|
-
|
|
26
|
-
from __future__ import annotations
|
|
27
|
-
|
|
28
|
-
from collections.abc import Mapping
|
|
29
|
-
from dataclasses import dataclass
|
|
30
|
-
from typing import Any
|
|
31
|
-
|
|
32
|
-
from codd.project_types import ProjectCapabilities
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
__all__ = ["E2EHarnessSpec", "resolve_e2e_harness"]
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
#: Config/constraint keys whose VALUE explicitly selects a node/Playwright
|
|
39
|
-
#: browser-automation harness. Matching is exact (lower-cased) — prose is never
|
|
40
|
-
#: parsed. Keeping this a small allow-list (rather than a substring scan) is what
|
|
41
|
-
#: keeps the resolver deterministic and free of LLM-inference.
|
|
42
|
-
_EXPLICIT_BROWSER_HARNESS_VALUES = frozenset(
|
|
43
|
-
{"playwright", "playwright_node", "cypress", "browser", "node"}
|
|
44
|
-
)
|
|
45
|
-
|
|
46
|
-
#: Constraint keys that, when truthy, declare browser automation is required.
|
|
47
|
-
_EXPLICIT_BROWSER_FLAG_KEYS = frozenset(
|
|
48
|
-
{"browser_automation_required", "requires_browser", "browser_required"}
|
|
49
|
-
)
|
|
50
|
-
|
|
51
|
-
#: Constraint keys whose value is read as an explicit harness selector.
|
|
52
|
-
_E2E_HARNESS_SELECTOR_KEYS = frozenset({"e2e_harness", "e2e_runner", "harness"})
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
@dataclass(frozen=True)
|
|
56
|
-
class E2EHarnessSpec:
|
|
57
|
-
"""The resolved web/HTTP E2E harness for a project.
|
|
58
|
-
|
|
59
|
-
``runner`` — logical runner id (``pytest_http`` | ``playwright`` |
|
|
60
|
-
``native_cli`` | ``none``).
|
|
61
|
-
``language`` — host language the generated tests are written in.
|
|
62
|
-
``output_ext``— file extension for generated E2E test files (``.py`` | ``.ts``).
|
|
63
|
-
``template_ref`` — the verification template the extractor/verify layer
|
|
64
|
-
routes this harness to (``pytest_http`` | ``playwright`` |
|
|
65
|
-
``native_cli`` | ``none``).
|
|
66
|
-
``requires_node_manifest`` — True when the harness needs a node manifest
|
|
67
|
-
(``package.json``) to run (Playwright). Consumed by the
|
|
68
|
-
conditional node-manifest scaffold (deferred) and the
|
|
69
|
-
toolchain-coherence gate; never inferred from prose.
|
|
70
|
-
"""
|
|
71
|
-
|
|
72
|
-
runner: str
|
|
73
|
-
language: str
|
|
74
|
-
output_ext: str
|
|
75
|
-
template_ref: str
|
|
76
|
-
requires_node_manifest: bool = False
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def _explicit_browser_required(constraints: Mapping[str, Any] | None) -> bool:
|
|
80
|
-
"""True ONLY when constraints/config EXPLICITLY declare browser automation.
|
|
81
|
-
|
|
82
|
-
Deterministic: a truthy boolean flag key (e.g. ``browser_automation_required:
|
|
83
|
-
true``) OR a harness-selector key whose value names a browser/node runner
|
|
84
|
-
(e.g. ``e2e_harness: playwright_node``). Ambiguous/absent → False, which
|
|
85
|
-
routes Python projects to ``pytest_http`` (at worst a false-RED / coverage
|
|
86
|
-
gap, never a false-GREEN). LLM prose is NEVER parsed.
|
|
87
|
-
"""
|
|
88
|
-
|
|
89
|
-
if not isinstance(constraints, Mapping):
|
|
90
|
-
return False
|
|
91
|
-
|
|
92
|
-
for key, value in constraints.items():
|
|
93
|
-
if not isinstance(key, str):
|
|
94
|
-
continue
|
|
95
|
-
normalized_key = key.strip().lower()
|
|
96
|
-
if normalized_key in _EXPLICIT_BROWSER_FLAG_KEYS and bool(value):
|
|
97
|
-
return True
|
|
98
|
-
if normalized_key in _E2E_HARNESS_SELECTOR_KEYS and isinstance(value, str):
|
|
99
|
-
if value.strip().lower() in _EXPLICIT_BROWSER_HARNESS_VALUES:
|
|
100
|
-
return True
|
|
101
|
-
return False
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
def resolve_e2e_harness(
|
|
105
|
-
*,
|
|
106
|
-
project_language: str | None,
|
|
107
|
-
capabilities: ProjectCapabilities,
|
|
108
|
-
constraints: Mapping[str, Any] | None = None,
|
|
109
|
-
) -> E2EHarnessSpec:
|
|
110
|
-
"""Deterministically resolve the E2E harness for a project.
|
|
111
|
-
|
|
112
|
-
Rules (pure function of inputs; no prose inference):
|
|
113
|
-
|
|
114
|
-
* ``e2e_modality == "cli"`` → native CLI harness (subprocess on the built
|
|
115
|
-
CLI). Output ext follows host language (``.py`` for Python, else ``.ts``).
|
|
116
|
-
The CLI branch already works end-to-end; this is here for completeness so
|
|
117
|
-
the resolver is the single decision point.
|
|
118
|
-
* ``e2e_modality == "browser"``:
|
|
119
|
-
- Python AND NOT explicit-browser-required → ``pytest_http`` / ``.py``.
|
|
120
|
-
- else → ``playwright`` / ``.ts`` (requires a node manifest).
|
|
121
|
-
* non-browser HTTP surface (``network_surface == "http"``) → ``pytest_http``
|
|
122
|
-
/ ``.py`` for Python; for any other language keep today's behavior by
|
|
123
|
-
routing to the Playwright/node path (``.ts``) so generality holds.
|
|
124
|
-
* otherwise → a ``none`` spec (no E2E layer applies).
|
|
125
|
-
"""
|
|
126
|
-
|
|
127
|
-
lang = (project_language or "").strip().lower()
|
|
128
|
-
is_python = lang == "python"
|
|
129
|
-
modality = capabilities.e2e_modality
|
|
130
|
-
|
|
131
|
-
if modality == "cli":
|
|
132
|
-
return E2EHarnessSpec(
|
|
133
|
-
runner="native_cli",
|
|
134
|
-
language=lang or "python",
|
|
135
|
-
output_ext=".py" if is_python else ".ts",
|
|
136
|
-
template_ref="native_cli",
|
|
137
|
-
)
|
|
138
|
-
|
|
139
|
-
if modality == "browser":
|
|
140
|
-
if is_python and not _explicit_browser_required(constraints):
|
|
141
|
-
return E2EHarnessSpec(
|
|
142
|
-
runner="pytest_http",
|
|
143
|
-
language="python",
|
|
144
|
-
output_ext=".py",
|
|
145
|
-
template_ref="pytest_http",
|
|
146
|
-
)
|
|
147
|
-
return E2EHarnessSpec(
|
|
148
|
-
runner="playwright",
|
|
149
|
-
language="typescript",
|
|
150
|
-
output_ext=".ts",
|
|
151
|
-
template_ref="playwright",
|
|
152
|
-
requires_node_manifest=True,
|
|
153
|
-
)
|
|
154
|
-
|
|
155
|
-
if capabilities.network_surface == "http":
|
|
156
|
-
if is_python:
|
|
157
|
-
return E2EHarnessSpec(
|
|
158
|
-
runner="pytest_http",
|
|
159
|
-
language="python",
|
|
160
|
-
output_ext=".py",
|
|
161
|
-
template_ref="pytest_http",
|
|
162
|
-
)
|
|
163
|
-
# Non-Python HTTP surface: preserve today's TS/Playwright behavior.
|
|
164
|
-
return E2EHarnessSpec(
|
|
165
|
-
runner="playwright",
|
|
166
|
-
language=lang or "typescript",
|
|
167
|
-
output_ext=".ts",
|
|
168
|
-
template_ref="playwright",
|
|
169
|
-
requires_node_manifest=True,
|
|
170
|
-
)
|
|
171
|
-
|
|
172
|
-
return E2EHarnessSpec(
|
|
173
|
-
runner="none",
|
|
174
|
-
language=lang or "python",
|
|
175
|
-
output_ext=".py" if is_python else ".ts",
|
|
176
|
-
template_ref="none",
|
|
177
|
-
)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|