codd-dev 2.26.0__tar.gz → 2.28.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.26.0 → codd_dev-2.28.0}/PKG-INFO +1 -1
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/__init__.py +1 -1
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/defaults.yaml +19 -3
- codd_dev-2.28.0/codd/dependency_lock_coherence.py +447 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/greenfield/pipeline.py +75 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/implement_oracle.py +384 -22
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/implement_oracle_scope.py +277 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/project_types.py +165 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/pyproject.toml +1 -1
- {codd_dev-2.26.0 → codd_dev-2.28.0}/.gitignore +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/LICENSE +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/bench_fixture/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/__main__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/_git_helper.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/action_outcome.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/ai_invoke.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/ai_patch.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/artifact_contract.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/artifact_ids.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/artifacts/catalog.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/assembler.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/bridge.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/brownfield/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/brownfield/pipeline.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/capability_completeness.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/claude_cli.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/cli.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/clustering.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/coherence_engine.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/confidence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/config.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/config_schema.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/contracts.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/auto_repair.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/builder.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/_one_to_many_detection.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/artifact_contract_check.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/ci_health.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/dependency_freshness.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/opt_out.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/ui_coherence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/extractor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/impact.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/dag/runner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/defaults.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployer.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/ai_command_factory.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/codex_app_server.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/deployment/providers/verification/vitest.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/design_md.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/diff/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/diff/apply.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/diff/engine.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/diff/persistence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/diff/templates/diff_prompt.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/discovery.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/drift.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/e2e_contract_coherence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/e2e_generator.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/e2e_runner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/apply.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/engine.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/finding.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/formatters/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/formatters/base.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/formatters/interactive.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/formatters/json_fmt.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/formatters/md.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/lexicon_loader.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/persistence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/elicit/templates/elicit_prompt_L0.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/env_refs.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/extract_ai.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/extract_paths.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/extractor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/candidate_selector.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/design_updater.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/impl_propagation.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/interactive_prompt.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/phenomenon_fixer.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/phenomenon_parser.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/risk_classifier.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/templates/clarification_question.txt +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/templates/design_update.txt +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/templates/impl_update.txt +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/templates/phenomenon_parse.txt +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/templates/risk_assessment.txt +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fix/templates_loader.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fixer.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fixup_drift.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/frontmatter.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/generator.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/git_evidence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/graph.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/greenfield/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hitl_session.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hooks/recipes/claude_requirements_nudge.json +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/iac_nfr.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/implementer.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/import_coherence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/inheritance.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/init/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/init/lexicon_suggest.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/init/llm_lexicon_suggester.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/init/stack_detector.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/html.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/json_fmt.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/formatters/md.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/inspector.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/manager.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/reporter.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/lexicon_cli/threshold.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/approval.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/parser.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/mcp_server.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/measure.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/operational_e2e_audit.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/operations_derive.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/_shared.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/api_specs.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/filesystem_routes.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/iac.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/python_ast.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/schemas.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/tests_builddeps.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/parsing/treesitter.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/planner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/policy.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/preflight/defaults/generic.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/propagate.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/propagation_common.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/propagator.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/reconciliation_ledger.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/registry.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/auto_scope_guard.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/engine.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/history.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/loop.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/proof_breaks.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/schema.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/templates/repair_strategy_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/test_failure_attribution.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/repair_slice.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/require.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/require_plugins.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/require_propagate.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/generic.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/generic.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirement_reconciliation.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/requirements_meta.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/restoration_report.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/restore.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/routes_extractor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/runtime_smoke/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/runtime_smoke/checks.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/runtime_smoke/config.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/runtime_smoke/report.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/runtime_smoke/runner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/scanner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/schema_refs.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/skills_cli/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/skills_cli/discovery.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/skills_cli/manager.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/skills_cli/paths.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/surface_reconciliation.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/synth.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/test_detection.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/test_import_coherence.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/traceability.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/validator.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/verifiable_behavior_audit.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/watch/__init__.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/watch/events.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/watch/watcher.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd/wiring.py +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ai_governance_eu_act/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rate_limiting_caching/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/api_rest_openapi/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/babok/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_event_cloudevents/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_graphql/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/backend_grpc_proto/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_hipaa/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_iso27001/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/compliance_pci_dss_4/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_aggregation_policies/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_eventsourcing_es_cqrs/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_governance_appi_gdpr/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_nosql_jsonschema/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/data_relational_iso_sql/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ddd_domain_driven_design/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/dora_sre_metrics/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/i18n_unicode_cldr/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ml_model_cards/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_a11y_native/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_android_material3/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_ios_hig/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/mobile_security_masvs/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_cicd_pipeline/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_iac_terraform/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_kubernetes/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/ops_observability_otel/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_iso25010/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/process_test_iso29119/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/twelve_factor_app/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_a11y_wcag22_aa/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_authn_webauthn/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_browser_compat/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_forms_html5/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_performance_core_web_vitals/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_pwa_manifest/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_responsive/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_security_owasp/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/coverage_matrix.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/elicit_extend.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/lexicon.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/manifest.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/recommended_kinds.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/lexicons/web_seo_schemaorg/severity_rules.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/codd_plugins/stack_map.yaml +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/docs/cookbook/presentation_aggregation/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/docs/requirements/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/dogfood/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/dogfood/fixtures/flat_py_app/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/examples/README.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-assemble/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-evolve/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-generate/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-greenfield/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-impact/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-init/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-propagate/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-restore/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-scan/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.0}/skills/codd-validate/SKILL.md +0 -0
- {codd_dev-2.26.0 → codd_dev-2.28.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.28.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
|
|
@@ -156,12 +156,28 @@ implement:
|
|
|
156
156
|
# re-opens the false-green window the gate closes). Greenfield-only.
|
|
157
157
|
implement_oracle: true
|
|
158
158
|
# Total implement-oracle attempts: one initial check + bounded corrective
|
|
159
|
-
# retries that re-run implementation with normalized oracle feedback. Default
|
|
160
|
-
#
|
|
159
|
+
# retries that re-run implementation with normalized oracle feedback. Default 5,
|
|
160
|
+
# sized to the escalation LADDER so every rung can be reached: initial(1) +
|
|
161
|
+
# narrow(<=2) + expanded(1) + broad(1). The 2nd narrow attempt is only spent
|
|
162
|
+
# while the repair is making progress (the loop classifies shrink vs
|
|
163
|
+
# oscillation); oscillation escalates immediately, so the budget is not wasted
|
|
164
|
+
# thrashing one rung. Minimum 1. NEVER unbounded -- a genuinely uncurable
|
|
161
165
|
# incoherence still fails honestly (nothing is silently accepted). Only CURABLE
|
|
162
166
|
# incoherence is retried; an environment/toolchain failure (failed dependency
|
|
163
167
|
# install) is not handed to the SUT to "fix" in source.
|
|
164
|
-
oracle_max_attempts:
|
|
168
|
+
oracle_max_attempts: 5
|
|
169
|
+
# Orphan-artifact gate (off | warn | enforce). The implement-time oracle's
|
|
170
|
+
# invariant: every GENERATED source artifact must be owned by exactly one
|
|
171
|
+
# implement task (or a declared harness/profile contract). An orphan (a file no
|
|
172
|
+
# task owns) sits OUTSIDE the artifact-contract graph -- its repair scope and
|
|
173
|
+
# write-fence are undecidable, so a non-deterministic SUT can keep mutating it
|
|
174
|
+
# invisibly. 'warn' (default) observes + reports orphans after implement but
|
|
175
|
+
# never blocks (the check is heuristic; a large behaviour change rolls out as
|
|
176
|
+
# warn). 'enforce' makes an orphan a hard stage failure. 'off' disables it. A
|
|
177
|
+
# legitimate helper a task wrote under its OWN output directory is adopted (it
|
|
178
|
+
# is dir-owned), so the warn list should be small. Only active for stacks with
|
|
179
|
+
# a declared implement-time oracle + a derivable owner index.
|
|
180
|
+
orphan_artifact_gate: warn
|
|
165
181
|
# Bounded wall-clock for ONE implement-oracle command run (seconds). tsc on a
|
|
166
182
|
# fresh build is fast, but a cold first run can compile a large module graph.
|
|
167
183
|
# Default 600.
|
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
"""Implement-end manifest↔lock coherence finalization (design:
|
|
2
|
+
/tmp/gpt_result_dep.txt, GPT-5.5 Pro consult 2026-06-15; verdict (b) primary +
|
|
3
|
+
(a) finalization + (c) forbidden).
|
|
4
|
+
|
|
5
|
+
WHAT
|
|
6
|
+
====
|
|
7
|
+
After the greenfield IMPLEMENT stage (the SUT has finished authoring source,
|
|
8
|
+
tests, AND ``package.json``) and BEFORE verify, this module:
|
|
9
|
+
|
|
10
|
+
1. RECONCILES the harness-owned test-toolchain dependency versions in the SUT's
|
|
11
|
+
manifest back to the profile's pins (verdict (b): vitest/typescript/
|
|
12
|
+
@types/node are the VERIFIER's tooling, not the app's business deps — the
|
|
13
|
+
harness recovers its OWN property; app/domain deps are never touched).
|
|
14
|
+
2. REFRESHES the lock deterministically to match the reconciled manifest
|
|
15
|
+
(verdict (a): ``npm install --package-lock-only`` updates ONLY
|
|
16
|
+
``package-lock.json``, no frozen check, no SUT feedback loop — a harness
|
|
17
|
+
FINALIZATION).
|
|
18
|
+
3. optionally MATERIALIZES node_modules with a FROZEN install (``npm ci``) so a
|
|
19
|
+
same-process implement-oracle typecheck has its deps against the now-coherent
|
|
20
|
+
lock.
|
|
21
|
+
|
|
22
|
+
WHY (the bug it closes)
|
|
23
|
+
=======================
|
|
24
|
+
verify's install preflight is a FROZEN install (``npm ci`` — see
|
|
25
|
+
``codd/repair/verify_runner.py`` + ``codd.project_types.node_install_command``).
|
|
26
|
+
That is CORRECT and stays (verdict (c): loosening ``npm ci`` → ``npm install``
|
|
27
|
+
would make verify a repair, not verification). The bug is that the SUT writes
|
|
28
|
+
``package.json`` with an OLD toolchain dep (``"vitest": "^1.6.0"``) while the
|
|
29
|
+
scaffold/gate install already produced a lock with the LATEST resolution
|
|
30
|
+
(``@vitest/expect@3.2.6``); ``npm ci`` then hard-fails on the lock↔manifest
|
|
31
|
+
mismatch. This module makes the manifest+lock COHERENT before verify, so the
|
|
32
|
+
frozen ``npm ci`` passes HONESTLY.
|
|
33
|
+
|
|
34
|
+
PROFILE-DRIVEN + GENERAL (design section D)
|
|
35
|
+
===========================================
|
|
36
|
+
This is the language-independent manifest↔lock coherence contract
|
|
37
|
+
(package-lock.json / uv.lock / poetry.lock / Cargo.lock / go.sum). The commands +
|
|
38
|
+
the reconcile RULE come from
|
|
39
|
+
:class:`codd.project_types.ToolchainDependencyProfile` on the stack's
|
|
40
|
+
:class:`~codd.project_types.LayoutProfile`. TS/npm is implemented now; Python/
|
|
41
|
+
Rust/Go are added as a profile entry + a reconcile-adapter entry here — never a
|
|
42
|
+
core edit. A stack whose profile declares ``toolchain_dependencies=None`` (Python
|
|
43
|
+
today) makes the whole finalization a strict NO-OP.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
from __future__ import annotations
|
|
47
|
+
|
|
48
|
+
import json
|
|
49
|
+
import subprocess
|
|
50
|
+
from collections.abc import Callable, Mapping
|
|
51
|
+
from dataclasses import dataclass, field
|
|
52
|
+
from pathlib import Path
|
|
53
|
+
from typing import Any
|
|
54
|
+
|
|
55
|
+
from codd.project_types import (
|
|
56
|
+
LayoutProfile,
|
|
57
|
+
ToolchainDependency,
|
|
58
|
+
ToolchainDependencyProfile,
|
|
59
|
+
resolve_layout_profile,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
__all__ = [
|
|
64
|
+
"DependencyLockResult",
|
|
65
|
+
"finalize_dependency_lock_coherence",
|
|
66
|
+
"reconcile_manifest_toolchain_deps",
|
|
67
|
+
"resolve_toolchain_profile",
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
#: Lock refresh + materialize can pull a tree on a cold cache. Bounded; the same
|
|
72
|
+
#: magnitude verify's preflight + the implement-oracle install use (override via
|
|
73
|
+
#: ``implement.lock_refresh_timeout_seconds``).
|
|
74
|
+
DEFAULT_LOCK_REFRESH_TIMEOUT_SECONDS = 900.0
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@dataclass
|
|
78
|
+
class DependencyLockResult:
|
|
79
|
+
"""Outcome of the implement-end manifest↔lock finalization.
|
|
80
|
+
|
|
81
|
+
``applied`` is True when the finalization actually ran for a stack that has a
|
|
82
|
+
toolchain profile (even if no dep needed changing — the lock was still
|
|
83
|
+
refreshed). ``skipped`` is True for a NO-OP (no toolchain profile, opted out,
|
|
84
|
+
or no manifest present). ``ok`` is False ONLY on a hard failure (a lock
|
|
85
|
+
refresh that exited non-zero / timed out) — an honest ``environment_build_error``
|
|
86
|
+
the caller surfaces.
|
|
87
|
+
"""
|
|
88
|
+
|
|
89
|
+
ok: bool = True
|
|
90
|
+
applied: bool = False
|
|
91
|
+
skipped: bool = False
|
|
92
|
+
reconciled: dict[str, tuple[str | None, str]] = field(default_factory=dict)
|
|
93
|
+
lock_refresh_command: str | None = None
|
|
94
|
+
materialize_command: str | None = None
|
|
95
|
+
detail: str = ""
|
|
96
|
+
|
|
97
|
+
@property
|
|
98
|
+
def reconciled_count(self) -> int:
|
|
99
|
+
return len(self.reconciled)
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
# ── opt-out + timeout config ─────────────────────────────────
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
def _opt_out(config: Mapping[str, Any] | None) -> bool:
|
|
106
|
+
"""``implement.dependency_lock_coherence: false`` — the explicit opt-out.
|
|
107
|
+
|
|
108
|
+
Default OFF (the finalization runs). Opting out re-opens the npm-ci-vs-lock
|
|
109
|
+
false-fail the contract closes, so it is never the default and never silent.
|
|
110
|
+
"""
|
|
111
|
+
section = (config or {}).get("implement") if isinstance(config, Mapping) else None
|
|
112
|
+
if isinstance(section, Mapping) and "dependency_lock_coherence" in section:
|
|
113
|
+
return section["dependency_lock_coherence"] is False
|
|
114
|
+
return False
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def _timeout_seconds(config: Mapping[str, Any] | None) -> float:
|
|
118
|
+
section = (config or {}).get("implement") if isinstance(config, Mapping) else None
|
|
119
|
+
if isinstance(section, Mapping):
|
|
120
|
+
raw = section.get("lock_refresh_timeout_seconds")
|
|
121
|
+
try:
|
|
122
|
+
value = float(raw)
|
|
123
|
+
if value > 0:
|
|
124
|
+
return value
|
|
125
|
+
except (TypeError, ValueError):
|
|
126
|
+
pass
|
|
127
|
+
return DEFAULT_LOCK_REFRESH_TIMEOUT_SECONDS
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
# ── resolution ───────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def resolve_toolchain_profile(
|
|
134
|
+
project_root: Path,
|
|
135
|
+
*,
|
|
136
|
+
language: str | None,
|
|
137
|
+
project_name: str | None,
|
|
138
|
+
source_dirs: Any = None,
|
|
139
|
+
test_dirs: Any = None,
|
|
140
|
+
config: Mapping[str, Any] | None = None,
|
|
141
|
+
profile: LayoutProfile | None = None,
|
|
142
|
+
) -> tuple[LayoutProfile, ToolchainDependencyProfile] | None:
|
|
143
|
+
"""Resolve the (layout, toolchain) profiles for a stack, or ``None`` (NO-OP).
|
|
144
|
+
|
|
145
|
+
``None`` when: the gate is opted out, the stack has no layout profile, or the
|
|
146
|
+
profile declares no ``toolchain_dependencies`` (Python today). The caller
|
|
147
|
+
treats ``None`` as "this stack has no manifest↔lock contract — skip silently".
|
|
148
|
+
"""
|
|
149
|
+
if _opt_out(config):
|
|
150
|
+
return None
|
|
151
|
+
if profile is None:
|
|
152
|
+
profile = resolve_layout_profile(
|
|
153
|
+
language=language,
|
|
154
|
+
project_name=project_name,
|
|
155
|
+
source_dirs=source_dirs,
|
|
156
|
+
test_dirs=test_dirs,
|
|
157
|
+
config=config,
|
|
158
|
+
project_root=project_root,
|
|
159
|
+
)
|
|
160
|
+
if profile is None or profile.toolchain_dependencies is None:
|
|
161
|
+
return None
|
|
162
|
+
return profile, profile.toolchain_dependencies
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
# ── manifest reconciliation (npm adapter; the per-ecosystem seam) ──
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def reconcile_manifest_toolchain_deps(
|
|
169
|
+
project_root: Path,
|
|
170
|
+
toolchain: ToolchainDependencyProfile,
|
|
171
|
+
) -> dict[str, tuple[str | None, str]]:
|
|
172
|
+
"""Reconcile the SUT manifest's HARNESS-OWNED toolchain dep versions in place.
|
|
173
|
+
|
|
174
|
+
Dispatches on the manifest filename (the per-ecosystem seam). TS/npm
|
|
175
|
+
(``package.json``) is implemented now: every dep in ``toolchain.deps`` is
|
|
176
|
+
written into the dev/prod-deps section with EXACTLY the profile's version
|
|
177
|
+
spec — overriding a SUT-authored version (the incoherence we recover from) and
|
|
178
|
+
ADDING any the SUT omitted (the scaffold's scripts need them). The SUT's app/
|
|
179
|
+
domain deps are NEVER in ``toolchain.deps`` and are left byte-for-byte.
|
|
180
|
+
|
|
181
|
+
Returns ``{name: (old_spec_or_None, new_spec)}`` for every dep that CHANGED
|
|
182
|
+
(added or overridden); an empty dict means the manifest was already coherent.
|
|
183
|
+
A manifest that does not exist, or whose filename has no adapter, is a no-op
|
|
184
|
+
(returns ``{}``) — the caller still refreshes the lock so a stale lock from a
|
|
185
|
+
prior install is reconciled to whatever the manifest actually declares.
|
|
186
|
+
"""
|
|
187
|
+
manifest = project_root / toolchain.manifest_filename
|
|
188
|
+
if not manifest.is_file():
|
|
189
|
+
return {}
|
|
190
|
+
if toolchain.manifest_filename == "package.json":
|
|
191
|
+
return _reconcile_package_json(manifest, toolchain)
|
|
192
|
+
# No adapter for this manifest format yet (pyproject.toml / Cargo.toml are
|
|
193
|
+
# DEFERRED): do not guess an edit for a manifest we cannot reason about.
|
|
194
|
+
return {}
|
|
195
|
+
|
|
196
|
+
|
|
197
|
+
def _reconcile_package_json(
|
|
198
|
+
manifest: Path,
|
|
199
|
+
toolchain: ToolchainDependencyProfile,
|
|
200
|
+
) -> dict[str, tuple[str | None, str]]:
|
|
201
|
+
"""npm adapter: force each harness-owned toolchain dep to the profile version.
|
|
202
|
+
|
|
203
|
+
Reads ``package.json`` as JSON (a non-JSON/unreadable manifest is left
|
|
204
|
+
untouched — the verify honesty/parse gates are the backstop). Each toolchain
|
|
205
|
+
dep is written to ``devDependencies`` (``dev=True``) or ``dependencies``,
|
|
206
|
+
de-duplicating: if the SUT placed the same dep in the OTHER section, that
|
|
207
|
+
stale entry is removed so the lock cannot resolve two ranges for one name.
|
|
208
|
+
Re-serializes with 2-space indent + trailing newline (matching the scaffold's
|
|
209
|
+
own ``package.json`` writes), preserving every other field and key order.
|
|
210
|
+
"""
|
|
211
|
+
try:
|
|
212
|
+
payload = json.loads(manifest.read_text(encoding="utf-8"))
|
|
213
|
+
except (OSError, json.JSONDecodeError):
|
|
214
|
+
return {}
|
|
215
|
+
if not isinstance(payload, dict):
|
|
216
|
+
return {}
|
|
217
|
+
|
|
218
|
+
changed: dict[str, tuple[str | None, str]] = {}
|
|
219
|
+
for dep in toolchain.deps:
|
|
220
|
+
old = _current_dep_spec(payload, dep.name)
|
|
221
|
+
if _apply_dep(payload, dep):
|
|
222
|
+
changed[dep.name] = (old, dep.version)
|
|
223
|
+
|
|
224
|
+
if changed:
|
|
225
|
+
manifest.write_text(json.dumps(payload, indent=2) + "\n", encoding="utf-8")
|
|
226
|
+
return changed
|
|
227
|
+
|
|
228
|
+
|
|
229
|
+
_DEP_SECTIONS = ("dependencies", "devDependencies")
|
|
230
|
+
|
|
231
|
+
|
|
232
|
+
def _current_dep_spec(payload: dict[str, Any], name: str) -> str | None:
|
|
233
|
+
"""The version spec the manifest currently declares for ``name`` (any section)."""
|
|
234
|
+
for section in _DEP_SECTIONS:
|
|
235
|
+
block = payload.get(section)
|
|
236
|
+
if isinstance(block, dict) and name in block:
|
|
237
|
+
return str(block.get(name))
|
|
238
|
+
return None
|
|
239
|
+
|
|
240
|
+
|
|
241
|
+
def _apply_dep(payload: dict[str, Any], dep: ToolchainDependency) -> bool:
|
|
242
|
+
"""Write ``dep`` at the profile's version into the correct section.
|
|
243
|
+
|
|
244
|
+
Returns True when the manifest CHANGED (the dep was absent, was at a different
|
|
245
|
+
version, or lived in the wrong section). Removes a same-named entry from the
|
|
246
|
+
other section so one toolchain dep never has two competing ranges.
|
|
247
|
+
"""
|
|
248
|
+
target_section = "devDependencies" if dep.dev else "dependencies"
|
|
249
|
+
other_section = "dependencies" if dep.dev else "devDependencies"
|
|
250
|
+
|
|
251
|
+
changed = False
|
|
252
|
+
|
|
253
|
+
# Drop a stale entry in the WRONG section (a SUT that put vitest in
|
|
254
|
+
# dependencies, say) so the refreshed lock resolves a single range.
|
|
255
|
+
other = payload.get(other_section)
|
|
256
|
+
if isinstance(other, dict) and dep.name in other:
|
|
257
|
+
del other[dep.name]
|
|
258
|
+
if not other:
|
|
259
|
+
del payload[other_section]
|
|
260
|
+
changed = True
|
|
261
|
+
|
|
262
|
+
block = payload.get(target_section)
|
|
263
|
+
if not isinstance(block, dict):
|
|
264
|
+
block = {}
|
|
265
|
+
payload[target_section] = block
|
|
266
|
+
if block.get(dep.name) != dep.version:
|
|
267
|
+
block[dep.name] = dep.version
|
|
268
|
+
changed = True
|
|
269
|
+
return changed
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
# ── lock refresh + materialization (deterministic finalization) ──
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def _run(command: str, project_root: Path, timeout: float) -> subprocess.CompletedProcess[str] | None:
|
|
276
|
+
"""Run a finalization command from the project root; ``None`` on timeout."""
|
|
277
|
+
try:
|
|
278
|
+
return subprocess.run(
|
|
279
|
+
command,
|
|
280
|
+
shell=True,
|
|
281
|
+
cwd=project_root,
|
|
282
|
+
capture_output=True,
|
|
283
|
+
text=True,
|
|
284
|
+
timeout=timeout,
|
|
285
|
+
)
|
|
286
|
+
except subprocess.TimeoutExpired:
|
|
287
|
+
return None
|
|
288
|
+
|
|
289
|
+
|
|
290
|
+
def _output_tail(stdout: str | None, stderr: str | None, limit: int = 4000) -> str:
|
|
291
|
+
combined = "\n".join(part.strip() for part in (stdout, stderr) if part and part.strip())
|
|
292
|
+
if len(combined) <= limit:
|
|
293
|
+
return combined
|
|
294
|
+
return f"... (truncated) ...\n{combined[-limit:]}"
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
# ── public entry: the stage-level finalization ──
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
def finalize_dependency_lock_coherence(
|
|
301
|
+
project_root: Path | str,
|
|
302
|
+
*,
|
|
303
|
+
language: str | None,
|
|
304
|
+
project_name: str | None,
|
|
305
|
+
source_dirs: Any = None,
|
|
306
|
+
test_dirs: Any = None,
|
|
307
|
+
config: Mapping[str, Any] | None = None,
|
|
308
|
+
echo: Callable[[str], None] = print,
|
|
309
|
+
profile: LayoutProfile | None = None,
|
|
310
|
+
) -> DependencyLockResult:
|
|
311
|
+
"""Reconcile harness-owned toolchain deps + refresh the lock, at implement-end.
|
|
312
|
+
|
|
313
|
+
Sequence (TS/npm; profile-driven so other ecosystems slot in):
|
|
314
|
+
|
|
315
|
+
1. Resolve the stack's toolchain profile. None declared → a NO-OP
|
|
316
|
+
(``skipped=True``) so Python/bash are untouched.
|
|
317
|
+
2. RECONCILE the manifest's harness-owned toolchain dep versions to the
|
|
318
|
+
profile (verdict (b)). App/domain deps are never touched.
|
|
319
|
+
3. REFRESH the lock to match the reconciled manifest with the profile's
|
|
320
|
+
deterministic ``lock_refresh_command`` (``npm install
|
|
321
|
+
--package-lock-only`` — verdict (a)). A non-zero/timeout is an honest
|
|
322
|
+
``environment_build_error`` → ``ok=False``.
|
|
323
|
+
4. optionally MATERIALIZE node_modules with the FROZEN
|
|
324
|
+
``materialize_command`` (``npm ci``) so a same-process implement-oracle
|
|
325
|
+
typecheck has its deps against the now-coherent lock. A materialize
|
|
326
|
+
failure here is the SAME honest failure verify would report (the lock is
|
|
327
|
+
coherent, so this should succeed); surfaced as ``ok=False``.
|
|
328
|
+
|
|
329
|
+
verify's OWN install stays a FROZEN ``npm ci`` (verdict (c)) — this function
|
|
330
|
+
never touches that path; it only makes the lock MATCH first.
|
|
331
|
+
"""
|
|
332
|
+
root = Path(project_root)
|
|
333
|
+
resolved = resolve_toolchain_profile(
|
|
334
|
+
root,
|
|
335
|
+
language=language,
|
|
336
|
+
project_name=project_name,
|
|
337
|
+
source_dirs=source_dirs,
|
|
338
|
+
test_dirs=test_dirs,
|
|
339
|
+
config=config,
|
|
340
|
+
profile=profile,
|
|
341
|
+
)
|
|
342
|
+
if resolved is None:
|
|
343
|
+
return DependencyLockResult(
|
|
344
|
+
ok=True,
|
|
345
|
+
skipped=True,
|
|
346
|
+
detail=f"no manifest↔lock toolchain contract for language {language!r} (skipped)",
|
|
347
|
+
)
|
|
348
|
+
_profile, toolchain = resolved
|
|
349
|
+
|
|
350
|
+
manifest = root / toolchain.manifest_filename
|
|
351
|
+
if not manifest.is_file():
|
|
352
|
+
# No manifest authored (an unusual node build, or implement produced none):
|
|
353
|
+
# nothing to reconcile and no lock to anchor — skip, never fail.
|
|
354
|
+
return DependencyLockResult(
|
|
355
|
+
ok=True,
|
|
356
|
+
skipped=True,
|
|
357
|
+
detail=f"no {toolchain.manifest_filename} present; manifest↔lock finalization skipped",
|
|
358
|
+
)
|
|
359
|
+
|
|
360
|
+
# 2. Reconcile harness-owned toolchain dep versions (verdict (b)).
|
|
361
|
+
reconciled = reconcile_manifest_toolchain_deps(root, toolchain)
|
|
362
|
+
if reconciled:
|
|
363
|
+
summary = ", ".join(
|
|
364
|
+
f"{name}: {old or '<absent>'} → {new}" for name, (old, new) in sorted(reconciled.items())
|
|
365
|
+
)
|
|
366
|
+
echo(
|
|
367
|
+
f"[greenfield] dependency-lock: reconciled {len(reconciled)} harness-owned "
|
|
368
|
+
f"toolchain dep(s) in {toolchain.manifest_filename} ({summary})"
|
|
369
|
+
)
|
|
370
|
+
else:
|
|
371
|
+
echo(
|
|
372
|
+
f"[greenfield] dependency-lock: toolchain deps in {toolchain.manifest_filename} "
|
|
373
|
+
"already at profile versions"
|
|
374
|
+
)
|
|
375
|
+
|
|
376
|
+
timeout = _timeout_seconds(config)
|
|
377
|
+
|
|
378
|
+
# 3. Refresh the lock to match the reconciled manifest (verdict (a)).
|
|
379
|
+
refresh_cmd = toolchain.lock_refresh_command
|
|
380
|
+
completed = _run(refresh_cmd, root, timeout)
|
|
381
|
+
if completed is None:
|
|
382
|
+
detail = f"lock refresh timed out after {timeout:g}s: {refresh_cmd}"
|
|
383
|
+
echo(f"[greenfield] dependency-lock: {detail}")
|
|
384
|
+
return DependencyLockResult(
|
|
385
|
+
ok=False,
|
|
386
|
+
applied=True,
|
|
387
|
+
reconciled=reconciled,
|
|
388
|
+
lock_refresh_command=refresh_cmd,
|
|
389
|
+
detail=detail,
|
|
390
|
+
)
|
|
391
|
+
if completed.returncode != 0:
|
|
392
|
+
tail = _output_tail(completed.stdout, completed.stderr)
|
|
393
|
+
detail = f"lock refresh failed (exit {completed.returncode}): {refresh_cmd}\n{tail}".rstrip()
|
|
394
|
+
echo(f"[greenfield] dependency-lock: {detail}")
|
|
395
|
+
return DependencyLockResult(
|
|
396
|
+
ok=False,
|
|
397
|
+
applied=True,
|
|
398
|
+
reconciled=reconciled,
|
|
399
|
+
lock_refresh_command=refresh_cmd,
|
|
400
|
+
detail=detail,
|
|
401
|
+
)
|
|
402
|
+
echo(f"[greenfield] dependency-lock: lock refreshed to match manifest ({refresh_cmd})")
|
|
403
|
+
|
|
404
|
+
# 4. Optionally materialize node_modules with a FROZEN install so a
|
|
405
|
+
# same-process implement-oracle typecheck has its deps (verdict: keep frozen).
|
|
406
|
+
materialize_cmd = toolchain.materialize_command
|
|
407
|
+
if materialize_cmd:
|
|
408
|
+
completed = _run(materialize_cmd, root, timeout)
|
|
409
|
+
if completed is None:
|
|
410
|
+
detail = f"dependency materialize timed out after {timeout:g}s: {materialize_cmd}"
|
|
411
|
+
echo(f"[greenfield] dependency-lock: {detail}")
|
|
412
|
+
return DependencyLockResult(
|
|
413
|
+
ok=False,
|
|
414
|
+
applied=True,
|
|
415
|
+
reconciled=reconciled,
|
|
416
|
+
lock_refresh_command=refresh_cmd,
|
|
417
|
+
materialize_command=materialize_cmd,
|
|
418
|
+
detail=detail,
|
|
419
|
+
)
|
|
420
|
+
if completed.returncode != 0:
|
|
421
|
+
tail = _output_tail(completed.stdout, completed.stderr)
|
|
422
|
+
detail = (
|
|
423
|
+
f"dependency materialize failed (exit {completed.returncode}): "
|
|
424
|
+
f"{materialize_cmd}\n{tail}"
|
|
425
|
+
).rstrip()
|
|
426
|
+
echo(f"[greenfield] dependency-lock: {detail}")
|
|
427
|
+
return DependencyLockResult(
|
|
428
|
+
ok=False,
|
|
429
|
+
applied=True,
|
|
430
|
+
reconciled=reconciled,
|
|
431
|
+
lock_refresh_command=refresh_cmd,
|
|
432
|
+
materialize_command=materialize_cmd,
|
|
433
|
+
detail=detail,
|
|
434
|
+
)
|
|
435
|
+
echo(f"[greenfield] dependency-lock: node_modules materialized (frozen: {materialize_cmd})")
|
|
436
|
+
|
|
437
|
+
return DependencyLockResult(
|
|
438
|
+
ok=True,
|
|
439
|
+
applied=True,
|
|
440
|
+
reconciled=reconciled,
|
|
441
|
+
lock_refresh_command=refresh_cmd,
|
|
442
|
+
materialize_command=materialize_cmd,
|
|
443
|
+
detail=(
|
|
444
|
+
f"reconciled {len(reconciled)} toolchain dep(s); lock refreshed via {refresh_cmd}"
|
|
445
|
+
+ (f"; materialized via {materialize_cmd}" if materialize_cmd else "")
|
|
446
|
+
),
|
|
447
|
+
)
|
|
@@ -701,6 +701,22 @@ class GreenfieldPipeline:
|
|
|
701
701
|
self._checkpoint(project_root)
|
|
702
702
|
self.echo(f"[greenfield] implement {task.task_id}: {detail}")
|
|
703
703
|
|
|
704
|
+
# Manifest↔lock coherence finalization — ONCE, at implement-end, AFTER the
|
|
705
|
+
# SUT has finished authoring package.json and BEFORE any frozen install
|
|
706
|
+
# (the implement-oracle's npm ci below, and verify's npm ci later). The SUT
|
|
707
|
+
# may have written an OLD test-toolchain dep (``"vitest": "^1.6.0"``) while
|
|
708
|
+
# the scaffold/gate install produced a lock with the LATEST resolution; a
|
|
709
|
+
# frozen ``npm ci`` then hard-fails on the lock↔manifest mismatch. This
|
|
710
|
+
# step RECONCILES the harness-owned toolchain dep versions back to the
|
|
711
|
+
# profile (vitest/typescript/@types/node are the VERIFIER's tooling, not
|
|
712
|
+
# the app's deps) and REFRESHES the lock (``npm install
|
|
713
|
+
# --package-lock-only``) so the frozen install passes HONESTLY. It runs
|
|
714
|
+
# BEFORE the implement-oracle so the oracle's own ``npm ci`` benefits from
|
|
715
|
+
# the coherent lock too. A strict NO-OP for stacks with no toolchain
|
|
716
|
+
# profile (Python today). verify's install stays FROZEN — see
|
|
717
|
+
# codd.dependency_lock_coherence.
|
|
718
|
+
self._finalize_dependency_lock_coherence(project_root)
|
|
719
|
+
|
|
704
720
|
# Implement-time native-oracle gate — ONCE, after every unit is generated
|
|
705
721
|
# and BEFORE the run advances to verify, while the SUT can still freely
|
|
706
722
|
# edit ALL files (source AND tests). For a compiler-class stack (TS=tsc
|
|
@@ -730,6 +746,65 @@ class GreenfieldPipeline:
|
|
|
730
746
|
)
|
|
731
747
|
record["detail"] = f"{len(tasks)} task(s) implemented"
|
|
732
748
|
|
|
749
|
+
def _finalize_dependency_lock_coherence(self, project_root: Path) -> None:
|
|
750
|
+
"""Reconcile harness-owned toolchain deps + refresh the lock (implement-end).
|
|
751
|
+
|
|
752
|
+
See the call site in :meth:`_stage_implement`. Ensures the stack topology
|
|
753
|
+
is scaffolded first (idempotent — the same ``_ensure_test_runner`` verify
|
|
754
|
+
uses) so a ``package.json`` exists to reconcile, then runs the profile-
|
|
755
|
+
driven finalization (:func:`finalize_dependency_lock_coherence`): reconcile
|
|
756
|
+
the manifest's harness-owned toolchain dep versions to the profile, refresh
|
|
757
|
+
the lock (``npm install --package-lock-only``), and materialize
|
|
758
|
+
node_modules with the FROZEN ``npm ci`` so a same-process implement-oracle
|
|
759
|
+
typecheck has its deps. A hard finalization failure (a lock refresh /
|
|
760
|
+
materialize that exits non-zero or times out) is an honest
|
|
761
|
+
``environment_build_error`` raised as a :class:`StageError`. A strict
|
|
762
|
+
NO-OP for a stack with no toolchain profile (Python today).
|
|
763
|
+
"""
|
|
764
|
+
from codd.dependency_lock_coherence import (
|
|
765
|
+
finalize_dependency_lock_coherence,
|
|
766
|
+
resolve_toolchain_profile,
|
|
767
|
+
)
|
|
768
|
+
|
|
769
|
+
config, language, source_dirs, test_dirs = self._layout_inputs(project_root)
|
|
770
|
+
project_name = self._layout_project_name(project_root, config)
|
|
771
|
+
|
|
772
|
+
# Cheap NO-OP short-circuit: a stack with no toolchain profile (Python
|
|
773
|
+
# today) needs no scaffold/echo — skip silently.
|
|
774
|
+
if resolve_toolchain_profile(
|
|
775
|
+
project_root,
|
|
776
|
+
language=language,
|
|
777
|
+
project_name=project_name,
|
|
778
|
+
source_dirs=source_dirs,
|
|
779
|
+
test_dirs=test_dirs,
|
|
780
|
+
config=config,
|
|
781
|
+
) is None:
|
|
782
|
+
return
|
|
783
|
+
|
|
784
|
+
# The finalization reconciles the SUT's package.json; make sure the
|
|
785
|
+
# scaffolded manifest (and its toolchain-script wiring) is present NOW, at
|
|
786
|
+
# implement-end. Idempotent + non-clobbering, so verify's re-scaffold is a
|
|
787
|
+
# no-op and a SUT-authored package.json is preserved (only its harness-
|
|
788
|
+
# owned toolchain dep VERSIONS are reconciled, by the step below).
|
|
789
|
+
self._ensure_test_runner(project_root)
|
|
790
|
+
|
|
791
|
+
result = finalize_dependency_lock_coherence(
|
|
792
|
+
project_root,
|
|
793
|
+
language=language,
|
|
794
|
+
project_name=project_name,
|
|
795
|
+
source_dirs=source_dirs,
|
|
796
|
+
test_dirs=test_dirs,
|
|
797
|
+
config=config,
|
|
798
|
+
echo=self.echo,
|
|
799
|
+
)
|
|
800
|
+
if not result.ok:
|
|
801
|
+
raise StageError(
|
|
802
|
+
"manifest↔lock coherence finalization failed at implement-end: "
|
|
803
|
+
f"{result.detail}. This is an environment/toolchain failure (the "
|
|
804
|
+
"lock could not be refreshed/materialized to match the reconciled "
|
|
805
|
+
"manifest), not a code defect."
|
|
806
|
+
)
|
|
807
|
+
|
|
733
808
|
def _enforce_implement_oracle_gate(
|
|
734
809
|
self,
|
|
735
810
|
project_root: Path,
|