codd-dev 2.92.0__tar.gz → 2.93.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.92.0 → codd_dev-2.93.0}/PKG-INFO +1 -1
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/__init__.py +1 -1
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/cli.py +22 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/greenfield/pipeline.py +59 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/compose.py +53 -6
- codd_dev-2.93.0/codd/stack/obligations.py +171 -0
- codd_dev-2.93.0/codd/stack/project.py +252 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/pyproject.toml +1 -1
- codd_dev-2.92.0/codd/stack/obligations.py +0 -76
- codd_dev-2.92.0/codd/stack/project.py +0 -112
- {codd_dev-2.92.0 → codd_dev-2.93.0}/.gitignore +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/LICENSE +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/bench_fixture/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/__main__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/action_outcome.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/ai_invoke.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/ai_patch.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/artifact_contract.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/artifact_ids.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/assembler.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/bridge.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/capability_completeness.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/claude_cli.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/clustering.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/confidence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/config.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/config_schema.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/__main__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/certify.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/generate_matrix.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/contracts_registry/registry.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coverage_execution_coherence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/impact.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/defaults.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/defaults.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/dependency_lock_coherence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployer.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/pytest_http.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/design_md.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/discovery.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/drift.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_harness.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/env_refs.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/extract_paths.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/extractor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixer.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/frontmatter.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/generator.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/git_evidence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/graph.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/iac_nfr.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implement_oracle.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implement_oracle_scope.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implement_oracle_types.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/implementer.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/import_coherence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/inheritance.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/implement_oracle.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/oracle_go.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/oracle_python.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/oracle_typescript.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/adapters/runner_report.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/builtin_adapters.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/compat.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/contract.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/loader.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/oracle_executor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/path_planner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profile.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profiles/go.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profiles/python.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/profiles/typescript.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/registry.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/verify_executor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/languages/verify_plan.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/measure.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/operations_derive.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/extractor_registry.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/iac.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/regex_strategies.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/planner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/policy.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/project_types.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/propagate.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/propagation_common.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/propagator.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/reference_resolution.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/registry.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/history.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/require.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/requirements_meta.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/restoration_report.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/restore.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/scanner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/_base.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/nextjs.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/adapters/playwright.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/command_authenticity.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/command_plan.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/loader.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/lock.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profile.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profiles/addons/playwright.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profiles/addons/prisma.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/profiles/frameworks/nextjs.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/registry.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/stack/resolve.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/synth.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/test_detection.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/traceability.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/validator.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/vb_marker_authenticity.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/vb_rerun_scope.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/events.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd/wiring.py +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/dogfood/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/examples/README.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.0}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-2.92.0 → codd_dev-2.93.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.93.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
|
|
@@ -7697,6 +7697,28 @@ def _intake_stack_contract_for_verify(project_root: Path, *, stack_command_execu
|
|
|
7697
7697
|
f"({', '.join(plan.command_ids)})"
|
|
7698
7698
|
)
|
|
7699
7699
|
|
|
7700
|
+
# Stack obligation CHECKER gate (Contract Kernel v2.77e) — the verify-path mirror of
|
|
7701
|
+
# the greenfield pipeline's :meth:`GreenfieldPipeline._enforce_stack_obligations`.
|
|
7702
|
+
# AFTER materialization (v2.77c) + authenticity (v2.77d), CHECK the composed
|
|
7703
|
+
# framework/addon OBLIGATIONS as a red/green gate: the Next.js ignoreBuildErrors guard
|
|
7704
|
+
# reds a build that would pass with type errors; the Playwright e2e_actually_executed
|
|
7705
|
+
# obligation reds a 0-test run. Anti-false-green: a missing/disabled/faulting checker
|
|
7706
|
+
# or an unenforceable ERROR obligation is RED (honest non-zero exit), never a silent
|
|
7707
|
+
# pass. Uses the ALREADY-RESOLVED ``contract`` from intake (no re-resolution from disk
|
|
7708
|
+
# — avoids a TOCTOU skip) and the SAME current-run evidence the authenticity layer
|
|
7709
|
+
# blessed. A non-stack project never reaches here (byte-identical).
|
|
7710
|
+
from codd.stack.project import StackObligationGateError, enforce_stack_obligation_gate
|
|
7711
|
+
|
|
7712
|
+
try:
|
|
7713
|
+
enforce_stack_obligation_gate(contract, project_root)
|
|
7714
|
+
except StackObligationGateError as exc:
|
|
7715
|
+
click.echo(f"[verify] stack obligation gate: {exc}", err=True)
|
|
7716
|
+
raise SystemExit(1) from exc
|
|
7717
|
+
click.echo(
|
|
7718
|
+
f"[verify] stack obligation gate: {len(contract.obligations)} obligation(s) checked "
|
|
7719
|
+
"— all enforced obligations satisfied"
|
|
7720
|
+
)
|
|
7721
|
+
|
|
7700
7722
|
|
|
7701
7723
|
def _run_verify_once(
|
|
7702
7724
|
path: str,
|
|
@@ -533,6 +533,26 @@ class GreenfieldPipeline:
|
|
|
533
533
|
{"status": STATUS_PENDING, "detail": ""}, str(exc),
|
|
534
534
|
)
|
|
535
535
|
|
|
536
|
+
# Stack obligation CHECKER gate (Contract Kernel v2.77e) — turn the framework/
|
|
537
|
+
# addon OBLIGATIONS into a red/green gate, AFTER materialization+authenticity. The
|
|
538
|
+
# composed commands now run (v2.77c) and are authentic (v2.77d); this CHECKS the
|
|
539
|
+
# declared obligations (the Next.js ignoreBuildErrors guard reds a build that would
|
|
540
|
+
# pass with type errors; the Playwright e2e_actually_executed obligation reds a
|
|
541
|
+
# 0-test run). Anti-false-green: a missing/disabled/faulting checker or an
|
|
542
|
+
# unenforceable ERROR obligation is RED, never a silent pass. Uses the ALREADY-
|
|
543
|
+
# RESOLVED contract (no re-resolution from disk — avoids a TOCTOU skip) and the
|
|
544
|
+
# SAME current-run evidence the authenticity layer blessed. Only for stack-declared
|
|
545
|
+
# projects (contract is not None) — a non-stack run is byte-identical (no gate).
|
|
546
|
+
# Routed through _fail like intake/lock/materialization.
|
|
547
|
+
try:
|
|
548
|
+
if contract is not None:
|
|
549
|
+
self._enforce_stack_obligations(project_root, session, contract)
|
|
550
|
+
except StageError as exc:
|
|
551
|
+
return self._fail(
|
|
552
|
+
project_root, session, options, "stack_obligations",
|
|
553
|
+
{"status": STATUS_PENDING, "detail": ""}, str(exc),
|
|
554
|
+
)
|
|
555
|
+
|
|
536
556
|
runners: dict[str, Callable[[Path, dict[str, Any], dict[str, Any]], None]] = {
|
|
537
557
|
"init": self._stage_init,
|
|
538
558
|
"elicit": self._stage_elicit,
|
|
@@ -756,6 +776,45 @@ class GreenfieldPipeline:
|
|
|
756
776
|
f"{len(plan.slots)} slot(s) invoked ({', '.join(plan.command_ids)})"
|
|
757
777
|
)
|
|
758
778
|
|
|
779
|
+
# ── stack obligation checker gate (Contract Kernel v2.77e) ──
|
|
780
|
+
|
|
781
|
+
def _enforce_stack_obligations(self, project_root: Path, session: dict[str, Any], contract) -> None:
|
|
782
|
+
"""Run the composed stack obligation checkers as a red/green gate (v2.77e).
|
|
783
|
+
|
|
784
|
+
See the call site in :meth:`run`. Only invoked for stack-declared projects
|
|
785
|
+
(``contract is not None``); non-stack projects never reach here, so they are
|
|
786
|
+
byte-identical (no obligation gate at all).
|
|
787
|
+
|
|
788
|
+
Uses the ALREADY-RESOLVED ``contract`` (passed in from intake/lock/
|
|
789
|
+
materialization) — NOT a re-resolution from disk — so a stack file that changes
|
|
790
|
+
or is deleted after materialization cannot make this gate silently skip (a
|
|
791
|
+
TOCTOU false-green). :func:`enforce_stack_obligation_gate` invokes every
|
|
792
|
+
obligation's registered checker with ``project_root`` plus the current-run
|
|
793
|
+
evidence (the SAME e2e report the authenticity layer blessed), and raises
|
|
794
|
+
:class:`StackObligationGateError` unless every ERROR obligation was genuinely
|
|
795
|
+
enforced AND satisfied: a blocking violation, an unenforced ERROR obligation
|
|
796
|
+
(no registered checker — unverifiable), or a checker fault (raised / None /
|
|
797
|
+
malformed return) is RED. Translated to :class:`StageError` so the autopilot
|
|
798
|
+
reports it honestly via ``_fail``. The per-obligation verdict counts are
|
|
799
|
+
recorded in the run trace (observable, like the lock verdict + command plan).
|
|
800
|
+
"""
|
|
801
|
+
from codd.stack.project import StackObligationGateError, enforce_stack_obligation_gate
|
|
802
|
+
|
|
803
|
+
try:
|
|
804
|
+
result = enforce_stack_obligation_gate(contract, project_root)
|
|
805
|
+
except StackObligationGateError as exc:
|
|
806
|
+
self.echo(f"[greenfield] stack obligation gate: {exc}")
|
|
807
|
+
raise StageError(str(exc)) from exc
|
|
808
|
+
|
|
809
|
+
record = session.get("stack_contract")
|
|
810
|
+
if isinstance(record, dict) and result is not None:
|
|
811
|
+
record["stack_obligations_checked"] = len(contract.obligations)
|
|
812
|
+
record["stack_obligations_unenforced"] = [o.id for o in result.unenforced]
|
|
813
|
+
self.echo(
|
|
814
|
+
"[greenfield] stack obligation gate: "
|
|
815
|
+
f"{len(contract.obligations)} obligation(s) checked — all enforced obligations satisfied"
|
|
816
|
+
)
|
|
817
|
+
|
|
759
818
|
# ── option resolution ───────────────────────────────────
|
|
760
819
|
|
|
761
820
|
def _resolve_options(self, project_root: Path) -> dict[str, Any]:
|
|
@@ -50,7 +50,14 @@ VERIFICATION_SLOTS = frozenset(
|
|
|
50
50
|
}
|
|
51
51
|
)
|
|
52
52
|
|
|
53
|
-
|
|
53
|
+
def _normalize_checker_ref(ref: str | None) -> str:
|
|
54
|
+
"""Canonical form of an obligation ``checker`` ref for redefinition comparison.
|
|
55
|
+
|
|
56
|
+
``None`` / empty / whitespace all normalize to ``""`` (no checker) so a later layer
|
|
57
|
+
that nulls or blanks the checker compares as a CHANGE vs. a non-empty ref (a real
|
|
58
|
+
weakening). Surrounding whitespace is stripped; the ref is otherwise compared
|
|
59
|
+
verbatim (we never claim two distinct refs are "equivalent")."""
|
|
60
|
+
return (ref or "").strip()
|
|
54
61
|
|
|
55
62
|
|
|
56
63
|
@dataclass(frozen=True)
|
|
@@ -199,7 +206,28 @@ def compose(
|
|
|
199
206
|
)
|
|
200
207
|
)
|
|
201
208
|
|
|
202
|
-
# -- obligations (union;
|
|
209
|
+
# -- obligations (union; a later layer may not silently REDEFINE an obligation) -
|
|
210
|
+
# An obligation id is a SEMANTIC KEY. A later layer may repeat the same id ONLY if
|
|
211
|
+
# the enforcement-relevant fields (severity + checker ref) are IDENTICAL — an exact
|
|
212
|
+
# idempotent duplicate (e.g. two layers asserting the same e2e obligation). ANY
|
|
213
|
+
# enforcement-relevant change is a semantic conflict (Contract Kernel v2.77e,
|
|
214
|
+
# GPT-5.5 Pro consult 2026-06-21):
|
|
215
|
+
#
|
|
216
|
+
# * severity mismatch (downgrade OR upgrade) — first-wins would SILENTLY pick one,
|
|
217
|
+
# hiding the ambiguity. A downgrade weakens; an upgrade silently DROPS a stricter
|
|
218
|
+
# later layer (a false-green relative to the intended stricter obligation). With
|
|
219
|
+
# no explicit monotone-merge semantics, ANY severity mismatch is RED (strict
|
|
220
|
+
# option — less clever, harder to game).
|
|
221
|
+
# * checker-ref change (including a redefinition that nulls/empties or points the
|
|
222
|
+
# checker at a different/weaker/unknown adapter) — "same severity, gutted checker"
|
|
223
|
+
# is real weakening that first-wins hides by luck, not by contract. A later layer
|
|
224
|
+
# that means a DIFFERENT check must use a DIFFERENT id; one that means the SAME
|
|
225
|
+
# check must use the SAME checker ref. (We do NOT try to prove two different refs
|
|
226
|
+
# are "equivalent" — intractable at the contract-kernel level.)
|
|
227
|
+
#
|
|
228
|
+
# first-wins is kept for the resolved set (the FIRST declaration stays authoritative),
|
|
229
|
+
# but a non-idempotent redefinition is RECORDED as a Conflict so the strict gate reds
|
|
230
|
+
# — silence is forbidden (no silent fallback).
|
|
203
231
|
obligations: list[Obligation] = []
|
|
204
232
|
obligation_owners: dict[str, str] = {}
|
|
205
233
|
obl_by_id: dict[str, Obligation] = {}
|
|
@@ -211,14 +239,33 @@ def compose(
|
|
|
211
239
|
obligation_owners[obl.id] = f"{kind}:{prof.id}"
|
|
212
240
|
continue
|
|
213
241
|
existing = obl_by_id[obl.id]
|
|
214
|
-
if
|
|
242
|
+
if obl.severity != existing.severity:
|
|
243
|
+
conflicts.append(
|
|
244
|
+
Conflict(
|
|
245
|
+
kind="semantic",
|
|
246
|
+
detail=(
|
|
247
|
+
f"obligation {obl.id!r} severity redefined to {obl.severity!r} "
|
|
248
|
+
f"by {kind}:{prof.id} (owner {obligation_owners[obl.id]} "
|
|
249
|
+
f"declared {existing.severity!r}) — a severity mismatch is a "
|
|
250
|
+
"semantic conflict (a downgrade weakens; an upgrade silently "
|
|
251
|
+
"drops a stricter layer); use the same id only for the same "
|
|
252
|
+
"obligation at the same severity"
|
|
253
|
+
),
|
|
254
|
+
layers=(obligation_owners[obl.id], f"{kind}:{prof.id}"),
|
|
255
|
+
)
|
|
256
|
+
)
|
|
257
|
+
elif _normalize_checker_ref(obl.checker) != _normalize_checker_ref(existing.checker):
|
|
215
258
|
conflicts.append(
|
|
216
259
|
Conflict(
|
|
217
260
|
kind="semantic",
|
|
218
261
|
detail=(
|
|
219
|
-
f"obligation {obl.id!r}
|
|
220
|
-
f"{kind}:{prof.id} (owner
|
|
221
|
-
f"declared {existing.
|
|
262
|
+
f"obligation {obl.id!r} checker redefined to "
|
|
263
|
+
f"{obl.checker!r} by {kind}:{prof.id} (owner "
|
|
264
|
+
f"{obligation_owners[obl.id]} declared {existing.checker!r}) — "
|
|
265
|
+
"a same-id checker-ref change is a semantic conflict (it would "
|
|
266
|
+
"silently keep one checker and discard the other); two different "
|
|
267
|
+
"checks need two different obligation ids, the same check needs "
|
|
268
|
+
"the same checker ref"
|
|
222
269
|
),
|
|
223
270
|
layers=(obligation_owners[obl.id], f"{kind}:{prof.id}"),
|
|
224
271
|
)
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"""Run a resolved stack contract's obligations through their registered checkers.
|
|
2
|
+
|
|
3
|
+
This is the GATE SEAM: greenfield/verify call :func:`enforce_obligations` with a
|
|
4
|
+
:class:`~codd.stack.compose.ResolvedStackContract` and the project context; each
|
|
5
|
+
obligation is dispatched to its registered checker (design §3 obligations). An
|
|
6
|
+
ERROR-severity obligation with findings is gate-blocking; a WARN one is advisory.
|
|
7
|
+
|
|
8
|
+
Anti-false-green (cardinal rule): a checker that is *not real enforcement* must
|
|
9
|
+
NEVER be read as "satisfied". Two distinct failure modes are surfaced, both
|
|
10
|
+
gate-blocking for an ERROR obligation (Contract Kernel v2.77e):
|
|
11
|
+
|
|
12
|
+
* ``unenforced`` — the obligation declares a checker ref that resolves to NOTHING
|
|
13
|
+
(missing ref / null / unregistered / a registry entry that is not callable). The
|
|
14
|
+
enforcement does not exist; an ERROR release-blocker with no checker is a failure,
|
|
15
|
+
never a silent pass.
|
|
16
|
+
* ``faults`` — the checker EXISTS but did not produce a usable verdict: it raised,
|
|
17
|
+
returned ``None`` (the canonical ``checker(...) or []`` false-green this layer
|
|
18
|
+
fixes — an unimplemented checker that falls off the end returns ``None``, which
|
|
19
|
+
must NOT collapse to "no findings"), or returned a non-list malformed value. The
|
|
20
|
+
obligation could not be honestly judged → RED for an ERROR obligation.
|
|
21
|
+
|
|
22
|
+
A WARN obligation that is unenforced or faults is advisory (does not block) — but is
|
|
23
|
+
still reported so the run record is honest. The conformance contract
|
|
24
|
+
(``tests/test_stack_obligations.py``) keeps the curated profiles' ERROR obligations
|
|
25
|
+
enforceable; a runtime caller must still surface these honestly.
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
from __future__ import annotations
|
|
29
|
+
|
|
30
|
+
from dataclasses import dataclass
|
|
31
|
+
|
|
32
|
+
from .adapters import resolve_checker
|
|
33
|
+
from .adapters._base import ObligationFinding
|
|
34
|
+
from .compose import ResolvedStackContract
|
|
35
|
+
from .profile import Obligation
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@dataclass(frozen=True)
|
|
39
|
+
class ObligationViolation:
|
|
40
|
+
obligation: Obligation
|
|
41
|
+
finding: ObligationFinding
|
|
42
|
+
|
|
43
|
+
@property
|
|
44
|
+
def blocking(self) -> bool:
|
|
45
|
+
return self.obligation.severity == "error"
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
@dataclass(frozen=True)
|
|
49
|
+
class ObligationFault:
|
|
50
|
+
"""A checker that EXISTS but produced no usable verdict (raised / None / malformed).
|
|
51
|
+
|
|
52
|
+
Distinct from a :class:`ObligationViolation` (the checker ran and found a real
|
|
53
|
+
violation) and from ``unenforced`` (no checker at all): here the checker was
|
|
54
|
+
invoked but could not be honestly read as "satisfied". For an ERROR obligation
|
|
55
|
+
this is RED — the obligation could not be enforced (anti-false-green: never treat
|
|
56
|
+
a broken checker as a pass).
|
|
57
|
+
"""
|
|
58
|
+
|
|
59
|
+
obligation: Obligation
|
|
60
|
+
reason: str
|
|
61
|
+
|
|
62
|
+
@property
|
|
63
|
+
def blocking(self) -> bool:
|
|
64
|
+
return self.obligation.severity == "error"
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
@dataclass(frozen=True)
|
|
68
|
+
class ObligationResult:
|
|
69
|
+
violations: tuple[ObligationViolation, ...]
|
|
70
|
+
unenforced: tuple[Obligation, ...]
|
|
71
|
+
faults: tuple[ObligationFault, ...] = ()
|
|
72
|
+
|
|
73
|
+
@property
|
|
74
|
+
def blocking_violations(self) -> tuple[ObligationViolation, ...]:
|
|
75
|
+
return tuple(v for v in self.violations if v.blocking)
|
|
76
|
+
|
|
77
|
+
@property
|
|
78
|
+
def blocking_faults(self) -> tuple[ObligationFault, ...]:
|
|
79
|
+
return tuple(f for f in self.faults if f.blocking)
|
|
80
|
+
|
|
81
|
+
@property
|
|
82
|
+
def passed(self) -> bool:
|
|
83
|
+
"""Gate verdict: GREEN only when every ERROR obligation was genuinely
|
|
84
|
+
enforced AND satisfied. RED on ANY of: a blocking violation; an unenforced
|
|
85
|
+
ERROR obligation (no checker — claimed enforcement that does not run); a
|
|
86
|
+
blocking fault (the checker exists but raised / returned None / returned a
|
|
87
|
+
malformed value — the obligation could not be honestly judged). All three are
|
|
88
|
+
anti-false-green: a release-blocker that was not really checked is never green."""
|
|
89
|
+
if self.blocking_violations:
|
|
90
|
+
return False
|
|
91
|
+
if self.blocking_faults:
|
|
92
|
+
return False
|
|
93
|
+
return not any(o.severity == "error" for o in self.unenforced)
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def enforce_obligations(
|
|
97
|
+
contract: ResolvedStackContract,
|
|
98
|
+
*,
|
|
99
|
+
project_root=None,
|
|
100
|
+
**checker_inputs,
|
|
101
|
+
) -> ObligationResult:
|
|
102
|
+
"""Dispatch each obligation to its registered checker and collect the result.
|
|
103
|
+
|
|
104
|
+
``checker_inputs`` (e.g. ``report_data=...`` / ``report_path=...``) are passed
|
|
105
|
+
through to every checker; each checker takes ``**kwargs`` and uses what it
|
|
106
|
+
needs (the Next.js guard reads ``project_root``; the Playwright guard reads
|
|
107
|
+
the report).
|
|
108
|
+
|
|
109
|
+
Hardened seam (v2.77e): a registered checker is invoked defensively. It must
|
|
110
|
+
return a ``list`` of findings (an empty list == SATISFIED). A checker that
|
|
111
|
+
raises, returns ``None``, or returns a non-list is recorded as an
|
|
112
|
+
:class:`ObligationFault` (NOT silently treated as satisfied) — the ``or []``
|
|
113
|
+
coercion that turned an unimplemented (``None``-returning) checker into a false
|
|
114
|
+
green is removed. A registry entry that is not callable is treated as
|
|
115
|
+
``unenforced`` (no usable checker exists).
|
|
116
|
+
"""
|
|
117
|
+
violations: list[ObligationViolation] = []
|
|
118
|
+
unenforced: list[Obligation] = []
|
|
119
|
+
faults: list[ObligationFault] = []
|
|
120
|
+
for obl in contract.obligations:
|
|
121
|
+
checker = resolve_checker(obl.checker)
|
|
122
|
+
if checker is None:
|
|
123
|
+
unenforced.append(obl)
|
|
124
|
+
continue
|
|
125
|
+
if not callable(checker):
|
|
126
|
+
# A registry entry that is not callable cannot enforce anything — there is
|
|
127
|
+
# no usable checker, so this is "unenforced", not a fault (same verdict for
|
|
128
|
+
# an ERROR obligation: RED).
|
|
129
|
+
unenforced.append(obl)
|
|
130
|
+
continue
|
|
131
|
+
try:
|
|
132
|
+
findings = checker(project_root=project_root, **checker_inputs)
|
|
133
|
+
except Exception as exc: # noqa: BLE001 — a crashing checker is NOT "satisfied".
|
|
134
|
+
faults.append(
|
|
135
|
+
ObligationFault(
|
|
136
|
+
obligation=obl,
|
|
137
|
+
reason=f"checker {obl.checker!r} raised {type(exc).__name__}: {exc}",
|
|
138
|
+
)
|
|
139
|
+
)
|
|
140
|
+
continue
|
|
141
|
+
if findings is None:
|
|
142
|
+
faults.append(
|
|
143
|
+
ObligationFault(
|
|
144
|
+
obligation=obl,
|
|
145
|
+
reason=(
|
|
146
|
+
f"checker {obl.checker!r} returned None (no verdict) — an "
|
|
147
|
+
"unimplemented or fall-through checker is not a satisfied "
|
|
148
|
+
"obligation (anti-false-green: never coerce None to no-findings)"
|
|
149
|
+
),
|
|
150
|
+
)
|
|
151
|
+
)
|
|
152
|
+
continue
|
|
153
|
+
if not isinstance(findings, list):
|
|
154
|
+
faults.append(
|
|
155
|
+
ObligationFault(
|
|
156
|
+
obligation=obl,
|
|
157
|
+
reason=(
|
|
158
|
+
f"checker {obl.checker!r} returned a non-list "
|
|
159
|
+
f"{type(findings).__name__} — a checker must return a list of "
|
|
160
|
+
"findings (empty == satisfied); a malformed return is not a pass"
|
|
161
|
+
),
|
|
162
|
+
)
|
|
163
|
+
)
|
|
164
|
+
continue
|
|
165
|
+
for finding in findings:
|
|
166
|
+
violations.append(ObligationViolation(obligation=obl, finding=finding))
|
|
167
|
+
return ObligationResult(
|
|
168
|
+
violations=tuple(violations),
|
|
169
|
+
unenforced=tuple(unenforced),
|
|
170
|
+
faults=tuple(faults),
|
|
171
|
+
)
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"""Project-level wiring seam: resolve + enforce a project's declared stack.
|
|
2
|
+
|
|
3
|
+
This is the bridge the greenfield/verify pipeline calls. A project opts into the
|
|
4
|
+
framework layer by declaring a ``stack:`` block in its codd.yaml (design §1)::
|
|
5
|
+
|
|
6
|
+
stack:
|
|
7
|
+
language: typescript
|
|
8
|
+
frameworks: [nextjs]
|
|
9
|
+
addons: [prisma, playwright]
|
|
10
|
+
|
|
11
|
+
* :func:`resolve_project_stack` reads that block and returns the
|
|
12
|
+
ResolvedStackContract — or ``None`` if the project declares no stack (the
|
|
13
|
+
framework layer is OPT-IN; a project without a ``stack:`` block is completely
|
|
14
|
+
unaffected, so Python/Go/plain-TS projects see no behaviour change).
|
|
15
|
+
* :func:`verify_project_stack` resolves then runs the obligation checkers,
|
|
16
|
+
returning the gate result (or ``None`` for a no-stack project).
|
|
17
|
+
|
|
18
|
+
The pipeline call-site reds on ``result is not None and not result.passed``.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
from __future__ import annotations
|
|
22
|
+
|
|
23
|
+
from pathlib import Path
|
|
24
|
+
from typing import Any, Mapping
|
|
25
|
+
|
|
26
|
+
from .compose import ResolvedStackContract
|
|
27
|
+
from .obligations import ObligationResult, enforce_obligations
|
|
28
|
+
from .resolve import resolve_stack_from_declaration
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def _read_stack_declaration(project_root: str | Path) -> Mapping[str, Any] | None:
|
|
32
|
+
"""Return the ``stack:`` block from the project's codd.yaml, or ``None``."""
|
|
33
|
+
from codd.config import load_project_config
|
|
34
|
+
|
|
35
|
+
try:
|
|
36
|
+
config = load_project_config(Path(project_root))
|
|
37
|
+
except (FileNotFoundError, ValueError):
|
|
38
|
+
return None
|
|
39
|
+
decl = config.get("stack")
|
|
40
|
+
if not decl or not isinstance(decl, Mapping):
|
|
41
|
+
return None
|
|
42
|
+
return decl
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def resolve_project_stack(project_root: str | Path) -> ResolvedStackContract | None:
|
|
46
|
+
"""Resolve a project's declared stack into a contract, or ``None`` if none.
|
|
47
|
+
|
|
48
|
+
``None`` means "this project does not use the framework layer" — never an
|
|
49
|
+
error (the framework layer is opt-in).
|
|
50
|
+
"""
|
|
51
|
+
decl = _read_stack_declaration(project_root)
|
|
52
|
+
if decl is None:
|
|
53
|
+
return None
|
|
54
|
+
return resolve_stack_from_declaration(decl)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
def verify_project_stack(
|
|
58
|
+
project_root: str | Path, **checker_inputs: Any
|
|
59
|
+
) -> ObligationResult | None:
|
|
60
|
+
"""Resolve + enforce a project's stack obligations (the framework verify gate).
|
|
61
|
+
|
|
62
|
+
Returns ``None`` for a project that declares no stack (no-op gate); otherwise
|
|
63
|
+
the :class:`ObligationResult` (``result.passed`` is the gate verdict;
|
|
64
|
+
``checker_inputs`` such as ``report_data=`` / ``report_path=`` are forwarded
|
|
65
|
+
to the checkers).
|
|
66
|
+
"""
|
|
67
|
+
contract = resolve_project_stack(project_root)
|
|
68
|
+
if contract is None:
|
|
69
|
+
return None
|
|
70
|
+
return enforce_obligations(contract, project_root=project_root, **checker_inputs)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class StackObligationGateError(RuntimeError):
|
|
74
|
+
"""The stack obligation-checker gate failed (Contract Kernel v2.77e).
|
|
75
|
+
|
|
76
|
+
Raised by :func:`enforce_stack_obligation_gate` when the resolved stack
|
|
77
|
+
contract's obligations are not all genuinely-enforced-and-satisfied
|
|
78
|
+
(:attr:`ObligationResult.passed` is False): a blocking violation, an unenforced
|
|
79
|
+
ERROR obligation (no registered checker), or a blocking fault (a checker that
|
|
80
|
+
raised / returned None / returned a malformed value). The call-sites translate
|
|
81
|
+
it to their context's RED — ``StageError`` in the greenfield pipeline (→
|
|
82
|
+
``_fail``), ``SystemExit`` non-zero on the verify CLI path — exactly like
|
|
83
|
+
:class:`codd.stack.command_plan.StackCommandMaterializationError` and
|
|
84
|
+
:class:`codd.stack.command_authenticity.StackCommandAuthenticityError`.
|
|
85
|
+
"""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
def build_obligation_checker_inputs(
|
|
89
|
+
contract: ResolvedStackContract,
|
|
90
|
+
project_root: str | Path,
|
|
91
|
+
) -> dict[str, Any]:
|
|
92
|
+
"""Assemble the obligation checkers' runtime inputs from CURRENT-RUN evidence.
|
|
93
|
+
|
|
94
|
+
Contract Kernel v2.77e. Most obligation checkers (e.g. the Next.js
|
|
95
|
+
``ignoreBuildErrors`` guard) read only the filesystem (``project_root``) and need
|
|
96
|
+
no extra input — the gate always passes ``project_root`` to every checker. The
|
|
97
|
+
one curated obligation that needs runtime evidence is the Playwright
|
|
98
|
+
``e2e_actually_executed`` check, which must see THIS run's e2e report.
|
|
99
|
+
|
|
100
|
+
The evidence is consumed from the SAME source the v2.77c/d materialization +
|
|
101
|
+
authenticity layer blessed — NOT re-derived or re-parsed with a divergent parser
|
|
102
|
+
(GPT-5.5 Pro consult 2026-06-21: prefer the authenticity-normalized
|
|
103
|
+
``report_data`` to avoid parser drift / TOCTOU). For each TEST-report slot in the
|
|
104
|
+
composed command plan, the slot's current-run report is parsed by the canonical
|
|
105
|
+
``runner_report`` adapter (the exact parser v2.77d uses) into normalized counts,
|
|
106
|
+
which are shaped into the ``report_data`` the obligation checker reads. Because
|
|
107
|
+
both layers use the canonical ``suites`` parser, a 0-test / fully-skipped e2e run
|
|
108
|
+
reds in BOTH (defense in depth on ONE evidence source, never two parsers).
|
|
109
|
+
|
|
110
|
+
Binding rule (anti-false-green): the report is passed ONLY when the current-run
|
|
111
|
+
evidence was genuinely produced AND readable this run (a stale file the executor
|
|
112
|
+
did not produce this run is NOT trusted → no report passed → a checker that needs
|
|
113
|
+
it reds on "missing report", which is the correct RED). If the plan has more than
|
|
114
|
+
one TEST-report slot the binding is AMBIGUOUS for a single ``report_data`` kwarg;
|
|
115
|
+
the curated stack has exactly one (Playwright ``e2e_test``), so this is a clean
|
|
116
|
+
single binding today — a future multi-e2e stack must disambiguate (left to the
|
|
117
|
+
step that introduces it; until then a second TEST-report slot is surfaced as an
|
|
118
|
+
error so it can never silently pick the wrong report).
|
|
119
|
+
"""
|
|
120
|
+
from codd.stack.command_authenticity import (
|
|
121
|
+
StackCommandObservationKind,
|
|
122
|
+
observe_stack_command_report,
|
|
123
|
+
resolve_stack_command_observation_policy,
|
|
124
|
+
)
|
|
125
|
+
from codd.stack.command_plan import stack_command_plan
|
|
126
|
+
|
|
127
|
+
root = Path(project_root)
|
|
128
|
+
plan = stack_command_plan(contract) # conflict gate already passed upstream; pure projection
|
|
129
|
+
|
|
130
|
+
test_report_obs: list[Any] = []
|
|
131
|
+
for slot in plan.slots:
|
|
132
|
+
policy = resolve_stack_command_observation_policy(
|
|
133
|
+
slot.slot_id, contract_policies=contract.command_observation_policies
|
|
134
|
+
)
|
|
135
|
+
if policy is None or policy.kind is not StackCommandObservationKind.TEST_REPORT:
|
|
136
|
+
continue
|
|
137
|
+
if not (slot.report_capture or slot.report_path):
|
|
138
|
+
continue
|
|
139
|
+
obs = observe_stack_command_report(slot, root, policy)
|
|
140
|
+
test_report_obs.append((slot, obs))
|
|
141
|
+
|
|
142
|
+
if not test_report_obs:
|
|
143
|
+
return {}
|
|
144
|
+
if len(test_report_obs) > 1:
|
|
145
|
+
slots = ", ".join(f"{s.slot_id}({s.owner})" for s, _ in test_report_obs)
|
|
146
|
+
raise StackObligationGateError(
|
|
147
|
+
"ambiguous obligation evidence: the resolved stack has more than one "
|
|
148
|
+
f"TEST-report command slot ({slots}); a single report binding cannot pick "
|
|
149
|
+
"one unambiguously (anti-false-green: never last-writer-wins across reports). "
|
|
150
|
+
"A multi-e2e stack must declare per-obligation evidence binding."
|
|
151
|
+
)
|
|
152
|
+
|
|
153
|
+
slot, obs = test_report_obs[0]
|
|
154
|
+
if not (obs.produced and obs.readable):
|
|
155
|
+
# The current-run evidence was NOT produced/readable this run — do NOT pass a
|
|
156
|
+
# stale or absent report. A checker that requires it then reds on "missing
|
|
157
|
+
# report" (the correct RED); we never feed it untrusted evidence.
|
|
158
|
+
return {}
|
|
159
|
+
|
|
160
|
+
# Shape the canonical-normalized counts into the report_data the obligation checker
|
|
161
|
+
# reads. ``expected`` = clean passes; ``unexpected``/``flaky`` = 0 so the checker's
|
|
162
|
+
# "executed = expected+unexpected+flaky" equals the canonical clean-pass count: a
|
|
163
|
+
# run with >=1 clean pass is GREEN; a fully-skipped/all-failed run (passed_cases==0)
|
|
164
|
+
# is RED — agreeing with the canonical parser, no divergent stats read of the file.
|
|
165
|
+
passed = int(obs.passed_cases or 0)
|
|
166
|
+
report_data = {"stats": {"expected": passed, "unexpected": 0, "flaky": 0, "skipped": 0}}
|
|
167
|
+
return {"report_data": report_data}
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
def enforce_stack_obligation_gate(
|
|
171
|
+
contract: ResolvedStackContract | None,
|
|
172
|
+
project_root: str | Path,
|
|
173
|
+
) -> ObligationResult | None:
|
|
174
|
+
"""The Contract Kernel v2.77e GATE: run the stack obligation checkers, RED on failure.
|
|
175
|
+
|
|
176
|
+
Wired AFTER v2.77c materialization + v2.77d authenticity. Takes the ALREADY-RESOLVED
|
|
177
|
+
contract (NO re-resolution from disk — avoids the TOCTOU hole where a stack file
|
|
178
|
+
changes/deletes between materialization and this gate and the obligation gate then
|
|
179
|
+
silently skips). For ``contract is None`` (a project that declared no stack) it is a
|
|
180
|
+
no-op → ``None`` (byte-identical, no gate). Otherwise it invokes every obligation's
|
|
181
|
+
registered checker with ``project_root`` plus the current-run evidence
|
|
182
|
+
(:func:`build_obligation_checker_inputs`) and raises :class:`StackObligationGateError`
|
|
183
|
+
unless :attr:`ObligationResult.passed` (every ERROR obligation genuinely enforced and
|
|
184
|
+
satisfied; an unenforced ERROR obligation, a blocking violation, or a checker fault is
|
|
185
|
+
RED). Returns the :class:`ObligationResult` on GREEN so the caller can record it.
|
|
186
|
+
"""
|
|
187
|
+
if contract is None:
|
|
188
|
+
return None
|
|
189
|
+
checker_inputs = build_obligation_checker_inputs(contract, project_root)
|
|
190
|
+
result = enforce_obligations(contract, project_root=Path(project_root), **checker_inputs)
|
|
191
|
+
if not result.passed:
|
|
192
|
+
reasons: list[str] = []
|
|
193
|
+
for v in result.blocking_violations:
|
|
194
|
+
reasons.append(f"[violation] {v.obligation.id}: {v.finding.detail}")
|
|
195
|
+
for f in result.blocking_faults:
|
|
196
|
+
reasons.append(f"[fault] {f.obligation.id}: {f.reason}")
|
|
197
|
+
for o in result.unenforced:
|
|
198
|
+
if o.severity == "error":
|
|
199
|
+
reasons.append(
|
|
200
|
+
f"[unenforced] {o.id}: no registered checker for ref {o.checker!r} "
|
|
201
|
+
"(an ERROR obligation with no checker is unverifiable — RED)"
|
|
202
|
+
)
|
|
203
|
+
raise StackObligationGateError(
|
|
204
|
+
f"stack obligation gate failed ({contract.stack_id}): "
|
|
205
|
+
+ "; ".join(reasons)
|
|
206
|
+
+ ". A framework/addon obligation was not genuinely enforced AND satisfied — "
|
|
207
|
+
"anti-false-green: a missing/disabled/faulting checker or a violated obligation "
|
|
208
|
+
"is RED, never a silent pass (Contract Kernel v2.77e)."
|
|
209
|
+
)
|
|
210
|
+
return result
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def stack_contract_trace(contract: ResolvedStackContract) -> dict[str, Any]:
|
|
214
|
+
"""Run-trace fields proving a run consumed the resolved stack contract.
|
|
215
|
+
|
|
216
|
+
Mirrors :meth:`codd.languages.contract.ResolvedLanguageContract.to_trace`: the
|
|
217
|
+
minimal, deterministic facts a run record / trace records so the live-consumption
|
|
218
|
+
of the framework-stack contract is observable (the v2.77a intake exit gate).
|
|
219
|
+
``stack_contract_hash`` is the deterministic :attr:`ResolvedStackContract.content_hash`;
|
|
220
|
+
``resolved_stack_id`` / ``resolved_stack_layers`` make "changing the profile changes
|
|
221
|
+
the plan" visible in the record itself.
|
|
222
|
+
"""
|
|
223
|
+
return {
|
|
224
|
+
"resolved_stack_id": contract.stack_id,
|
|
225
|
+
"stack_contract_hash": contract.content_hash,
|
|
226
|
+
"resolved_stack_layers": [f"{ref.kind}:{ref.id}" for ref in contract.layers],
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
|
|
230
|
+
def stack_contract_intake(project_root: str | Path) -> ResolvedStackContract | None:
|
|
231
|
+
"""Resolve a project's declared stack contract for LIVE consumption (intake only).
|
|
232
|
+
|
|
233
|
+
This is the production seam the greenfield/verify pipeline calls EARLY in a run
|
|
234
|
+
to bring the (previously dormant) framework-stack contract into the live run —
|
|
235
|
+
*without* enforcing any obligation yet (enforcement is v2.77b-e). It is exactly
|
|
236
|
+
:func:`resolve_project_stack`, named for the intake call-site so the
|
|
237
|
+
"no non-test caller = 0 state" is eliminated by an unambiguous production caller.
|
|
238
|
+
|
|
239
|
+
Contract:
|
|
240
|
+
|
|
241
|
+
* No ``stack:`` block (the opt-in framework layer is unused) → ``None``. The
|
|
242
|
+
vast majority of projects; behaviour is byte-identical, never an error.
|
|
243
|
+
* A declared ``stack:`` block → the :class:`ResolvedStackContract` (its
|
|
244
|
+
``content_hash`` is the run-trace hash; see :func:`stack_contract_trace`).
|
|
245
|
+
* A declared-but-BROKEN block (unknown language/framework/addon, malformed
|
|
246
|
+
mapping) → the resolver RAISES (``ValueError`` / ``UnknownLanguageError`` /
|
|
247
|
+
``UnknownLayerError``). The intake NEVER swallows this: anti-false-green
|
|
248
|
+
forbids a declared-but-unresolvable stack from silently proceeding as if no
|
|
249
|
+
stack were declared. The pipeline call-site turns the raise into an honest
|
|
250
|
+
stage/command failure.
|
|
251
|
+
"""
|
|
252
|
+
return resolve_project_stack(project_root)
|