codd-dev 1.34.0__tar.gz → 1.35.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- codd_dev-1.35.0/PKG-INFO +354 -0
- codd_dev-1.35.0/README.md +314 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/cli.py +1209 -905
- codd_dev-1.35.0/codd/diff/__init__.py +6 -0
- codd_dev-1.35.0/codd/diff/apply.py +225 -0
- codd_dev-1.35.0/codd/diff/engine.py +192 -0
- codd_dev-1.35.0/codd/diff/persistence.py +101 -0
- codd_dev-1.35.0/codd/diff/templates/diff_prompt.md +37 -0
- codd_dev-1.35.0/codd/elicit/__init__.py +15 -0
- codd_dev-1.35.0/codd/elicit/apply.py +232 -0
- codd_dev-1.35.0/codd/elicit/engine.py +259 -0
- codd_dev-1.35.0/codd/elicit/finding.py +153 -0
- codd_dev-1.35.0/codd/elicit/formatters/__init__.py +8 -0
- codd_dev-1.35.0/codd/elicit/formatters/base.py +18 -0
- codd_dev-1.35.0/codd/elicit/formatters/interactive.py +102 -0
- codd_dev-1.35.0/codd/elicit/formatters/json_fmt.py +31 -0
- codd_dev-1.35.0/codd/elicit/formatters/md.py +103 -0
- codd_dev-1.35.0/codd/elicit/lexicon_loader.py +156 -0
- codd_dev-1.35.0/codd/elicit/persistence.py +153 -0
- codd_dev-1.35.0/codd/elicit/templates/elicit_prompt_L0.md +66 -0
- codd_dev-1.35.0/codd/repair/proof_breaks.py +220 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/pyproject.toml +1 -1
- codd_dev-1.34.0/PKG-INFO +0 -1141
- codd_dev-1.34.0/README.md +0 -1101
- {codd_dev-1.34.0 → codd_dev-1.35.0}/.gitignore +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/LICENSE +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/__main__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/_git_helper.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/ask_user_question_adapter.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/assembler.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/bridge.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/clustering.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/coherence_adapters.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/coherence_engine.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/config.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/contracts.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/coverage_auditor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/coverage_metrics.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/builder.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/depends_on_consistency.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/deployment_completeness.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/edge_validity.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/environment_coverage.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/implementation_coverage.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/node_completeness.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/task_completion.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/transitive_closure.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/checks/user_journey_coherence.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/coverage_axes.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/cli.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/cpp_embedded.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/csharp.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/elixir.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/generic.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/iot.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/java.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/kotlin.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/mobile.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/ruby.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/rust.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/scala.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/swift.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/test_frameworks.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/defaults/web.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/extractor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/dag/runner.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/defaults.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deploy_targets/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deploy_targets/app_service.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deploy_targets/base.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deploy_targets/docker_compose.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployer.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/checks/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/defaults/deploy_targets.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/defaults/runtime_capability_inference.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/defaults/schema_providers.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/defaults/verification_templates.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/extractor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/ai_command.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/llm_consideration.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/schema/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/schema/prisma.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/target/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/target/docker_compose.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/assertion_handlers.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/cdp_browser.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/cdp_engines.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/cdp_launchers.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/cdp_wire.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/curl.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/form_strategies.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/means_catalog.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/deployment/providers/verification/playwright.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/design_md.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/drift.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/e2e_extractor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/e2e_generator.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/e2e_runner.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/env_refs.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/extract_ai.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/extractor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/fixer.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/fixup_drift.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/fixup_drift_strategies/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/fixup_drift_strategies/design_token_drift.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/fixup_drift_strategies/lexicon_violation.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/fixup_drift_strategies/url_drift.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/generator.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/graph.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/hitl_session.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/hooks/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/hooks/pre-commit +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/hooks/recipes/claude_settings_example.json +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/hooks/recipes/codex_hook.sh +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/hooks/recipes/git_post_commit.sh +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/hooks/recipes/git_pre_commit.sh +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/implementer/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/implementer/chunked_runner.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/implementer/typecheck_loop.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/implementer.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/inheritance.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/knowledge_fetcher.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/lexicon.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/approval.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/best_practice_augmenter.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/criteria_expander.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/design_doc_extractor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/impl_step_deriver.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/means_catalog_loader.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/parser.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/plan_deriver.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/prompt_builder.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/strategy_validator.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/best_practice_augment_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/criteria_expand_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/design_doc_extract_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/impl_step_derive_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/implementation_step_catalog.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/meta_instruction.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/plan_derive_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/llm/templates/verification_means_catalog.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/mcp_server.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/measure.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/parsing.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/planner.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/policy.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/preflight/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/preflight/defaults/cli.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/preflight/defaults/iot.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/preflight/defaults/mobile.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/preflight/defaults/web.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/propagate.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/propagator.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/registry.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/approval_repair.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/engine.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/git_patcher.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/history.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/llm_repair_engine.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/loop.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/primary_picker.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/repair_result.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/repairability_classifier.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/schema.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/templates/analyze_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/templates/propose_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/templates/repairability_meta.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair/verify_runner.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/repair_slice.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/require.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/require_plugins.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/require_propagate.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/required_artifacts/defaults/cli.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/required_artifacts/defaults/iot.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/required_artifacts/defaults/mobile.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/required_artifacts/defaults/web.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/required_artifacts_deriver.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/requirement_completeness/defaults/cli.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/requirement_completeness/defaults/iot.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/requirement_completeness/defaults/mobile.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/requirement_completeness/defaults/web.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/requirement_completeness_auditor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/restore.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/routes_extractor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/scanner.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/schema_refs.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/screen_flow_validator.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/screen_transition_extractor.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/screen_transitions/defaults.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/synth.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/codd.yaml.tmpl +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/conventions.yaml.tmpl +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/data_dependencies.yaml.tmpl +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/doc_links.yaml.tmpl +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/extract_ai_prompt_baseline.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/extracted/api-contract.md.j2 +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/extracted/architecture-overview.md.j2 +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/extracted/module-detail.md.j2 +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/extracted/schema-design.md.j2 +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/extracted/system-context.md.j2 +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/gitignore.tmpl +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/lexicon_questions.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/lexicon_schema.yaml +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/templates/overrides.yaml.tmpl +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/traceability.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/validator.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/watch/__init__.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/watch/events.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/watch/propagation_log.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/watch/propagation_pipeline.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/watch/test_runner.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/watch/watcher.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/codd/wiring.py +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/docs/cookbook/cdp_browser/README.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/docs/requirements/README.md +0 -0
- {codd_dev-1.34.0 → codd_dev-1.35.0}/tests/integration/standalone_repair_skeleton/README.md +0 -0
codd_dev-1.35.0/PKG-INFO
ADDED
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: codd-dev
|
|
3
|
+
Version: 1.35.0
|
|
4
|
+
Summary: CoDD: Coherence-Driven Development — cross-artifact change impact analysis
|
|
5
|
+
Project-URL: Homepage, https://github.com/yohey-w/codd-dev
|
|
6
|
+
Project-URL: Repository, https://github.com/yohey-w/codd-dev
|
|
7
|
+
Project-URL: Issues, https://github.com/yohey-w/codd-dev/issues
|
|
8
|
+
Author-email: Yohei Watanabe <yohey-w@users.noreply.github.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: change-impact,claude-code,dependency-graph,plugin,software-engineering
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3
|
|
16
|
+
Classifier: Topic :: Software Development :: Quality Assurance
|
|
17
|
+
Requires-Python: >=3.10
|
|
18
|
+
Requires-Dist: click>=8.0
|
|
19
|
+
Requires-Dist: jinja2>=3.1.0
|
|
20
|
+
Requires-Dist: pyyaml>=6.0
|
|
21
|
+
Requires-Dist: tomli>=2.0.1; python_version < '3.11'
|
|
22
|
+
Requires-Dist: watchdog>=4.0.0
|
|
23
|
+
Requires-Dist: websocket-client>=1.8.0
|
|
24
|
+
Provides-Extra: ai
|
|
25
|
+
Provides-Extra: api-parsers
|
|
26
|
+
Requires-Dist: graphql-core>=3.2.0; extra == 'api-parsers'
|
|
27
|
+
Provides-Extra: infra
|
|
28
|
+
Requires-Dist: python-hcl2>=7.0.0; extra == 'infra'
|
|
29
|
+
Provides-Extra: mcp
|
|
30
|
+
Provides-Extra: scan
|
|
31
|
+
Requires-Dist: tree-sitter-java>=0.22; extra == 'scan'
|
|
32
|
+
Requires-Dist: tree-sitter-python>=0.22; extra == 'scan'
|
|
33
|
+
Requires-Dist: tree-sitter-typescript>=0.22; extra == 'scan'
|
|
34
|
+
Requires-Dist: tree-sitter>=0.22; extra == 'scan'
|
|
35
|
+
Provides-Extra: tree-sitter
|
|
36
|
+
Requires-Dist: tree-sitter-python<0.26.0,>=0.25.0; extra == 'tree-sitter'
|
|
37
|
+
Requires-Dist: tree-sitter-typescript<0.24.0,>=0.23.0; extra == 'tree-sitter'
|
|
38
|
+
Requires-Dist: tree-sitter<0.26.0,>=0.25.0; extra == 'tree-sitter'
|
|
39
|
+
Description-Content-Type: text/markdown
|
|
40
|
+
|
|
41
|
+
<p align="center">
|
|
42
|
+
<strong>CoDD - Coherence-Driven Development</strong>
|
|
43
|
+
</p>
|
|
44
|
+
|
|
45
|
+
<p align="center">
|
|
46
|
+
<a href="https://pypi.org/project/codd-dev/"><img src="https://img.shields.io/pypi/v/codd-dev?style=flat-square&color=blue" alt="PyPI"></a>
|
|
47
|
+
<a href="https://pypi.org/project/codd-dev/"><img src="https://img.shields.io/pypi/pyversions/codd-dev?style=flat-square" alt="Python"></a>
|
|
48
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="License"></a>
|
|
49
|
+
<a href="https://github.com/yohey-w/codd-dev/stargazers"><img src="https://img.shields.io/github/stars/yohey-w/codd-dev?style=flat-square" alt="Stars"></a>
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
<p align="center">
|
|
53
|
+
<a href="README_ja.md">日本語</a> | English | <a href="README_zh.md">中文</a>
|
|
54
|
+
</p>
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## North Star (Vision)
|
|
59
|
+
|
|
60
|
+
**"Write only functional requirements and constraints. Code is generated, repaired, and verified automatically."**
|
|
61
|
+
|
|
62
|
+
CoDD treats **requirements -> design -> implementation -> tests** as one DAG, mechanically verifies the coherence of every node, and lets an LLM repair inconsistencies automatically when they appear. Humans write only **what to build** and **where the boundaries are**.
|
|
63
|
+
|
|
64
|
+
## Where We Are (v1.34.0)
|
|
65
|
+
|
|
66
|
+
The North Star is far, but **within bounded conditions, CoDD has reached practical use**:
|
|
67
|
+
|
|
68
|
+
- ✅ Dogfooded on a real project (Next.js + Prisma + TypeScript Web app)
|
|
69
|
+
- ✅ `codd verify --auto-repair` completes with `PARTIAL_SUCCESS` on a real LMS project (attempts=4 / applied_patches=4 / unrepairable=2)
|
|
70
|
+
- ✅ DAG completeness with 9 coherence checks operational
|
|
71
|
+
- ⚠️ Single viewport / single persona assumed (Coverage Axis Layer C9 introduced in v1.32.0; axis variety is continuing work)
|
|
72
|
+
- ⚠️ Specification completeness Level 1 (finding holes in requirements) is planned for v1.35.0 `codd elicit`
|
|
73
|
+
- ⚠️ Other domains (Mobile / Desktop / CLI / Embedded / ML) are not yet validated
|
|
74
|
+
- ⚠️ Reducing unrepairable items is continuing improvement
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
pip install codd-dev
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Quick Start (5 min)
|
|
83
|
+
|
|
84
|
+
### 1. Install
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
pip install codd-dev
|
|
88
|
+
codd --version # 1.34.0 or later
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 2. Add codd.yaml to your project
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
# codd.yaml
|
|
95
|
+
codd_required_version: ">=1.34.0"
|
|
96
|
+
|
|
97
|
+
dag:
|
|
98
|
+
design_docs:
|
|
99
|
+
- "docs/design/**/*.md"
|
|
100
|
+
implementations:
|
|
101
|
+
- "src/**/*.{ts,tsx,py}"
|
|
102
|
+
tests:
|
|
103
|
+
- "tests/**/*.{spec,test}.{ts,tsx,py}"
|
|
104
|
+
|
|
105
|
+
repair:
|
|
106
|
+
approval_mode: required # automatic repair requires human approval
|
|
107
|
+
max_attempts: 10
|
|
108
|
+
|
|
109
|
+
llm:
|
|
110
|
+
ai_command: "claude" # any LLM CLI can be invoked (claude / codex / gemini, etc.)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 3. Common commands
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
# Coherence verification (checks consistency across requirements, design, implementation, and tests)
|
|
117
|
+
codd dag verify
|
|
118
|
+
|
|
119
|
+
# Verification with auto-repair (when violations are found, an LLM generates and applies patches)
|
|
120
|
+
codd dag verify --auto-repair --max-attempts 10
|
|
121
|
+
|
|
122
|
+
# Confirm User Journey PASS in a real browser (browser control via CDP)
|
|
123
|
+
codd dag run-journey login_to_dashboard --axis viewport=smartphone_se
|
|
124
|
+
|
|
125
|
+
# Derive implementation steps from design docs (input to the implementation phase)
|
|
126
|
+
codd implement run --task M1.2 --enable-typecheck-loop
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
### 4. Reading the output
|
|
130
|
+
|
|
131
|
+
`codd dag verify` runs 9 coherence checks:
|
|
132
|
+
|
|
133
|
+
| Check | Role |
|
|
134
|
+
|-------|------|
|
|
135
|
+
| `node_completeness` | Confirms nodes declared in design docs (implementation/test files) exist as physical files |
|
|
136
|
+
| `transitive_closure` | Confirms the dependency chain from requirements -> design -> implementation -> tests is closed |
|
|
137
|
+
| `verification_test_runtime` | Confirms tests for implementations can run and pass |
|
|
138
|
+
| `deployment_completeness` | Confirms the deployment chain (Dockerfile/compose/k8s) is complete |
|
|
139
|
+
| `proof_break_authority` | Confirms critical journeys are not broken |
|
|
140
|
+
| `screen_flow_edges` | Detects isolated nodes in the screen transition graph |
|
|
141
|
+
| `screen_flow_completeness` | Confirms every screen is mapped to requirements |
|
|
142
|
+
| `c8` | Detects uncommitted patches / dirty files |
|
|
143
|
+
| `c9` (`environment_coverage`) | Confirms **target environment coverage** such as viewport, RBAC role, and locale |
|
|
144
|
+
|
|
145
|
+
When violations are found, the deploy gate is blocked. With `--auto-repair`, CoDD enters a loop that asks an LLM to generate patches, applies them, and verifies again.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Typical Use Cases
|
|
150
|
+
|
|
151
|
+
### Use Case 1: Automating requirements -> design -> implementation
|
|
152
|
+
|
|
153
|
+
Write "functional requirements + constraints" in `docs/requirements/*.md`, then run `codd implement run`:
|
|
154
|
+
|
|
155
|
+
1. An LLM dynamically derives ImplStep sequences from the requirements (Layer 1)
|
|
156
|
+
2. Best-practice gaps are filled in (Layer 2, such as logout, Remember Me, and session timeout for login)
|
|
157
|
+
3. After user approval through a HITL gate, implementation is generated into `src/**`
|
|
158
|
+
4. If a type checker such as `tsc` fails during generation, CoDD enters the auto-repair loop
|
|
159
|
+
|
|
160
|
+
### Use Case 2: Auto-Repair (`codd verify --auto-repair`)
|
|
161
|
+
|
|
162
|
+
Run `codd dag verify --auto-repair --max-attempts 10` in CI:
|
|
163
|
+
|
|
164
|
+
1. 9 coherence checks are executed
|
|
165
|
+
2. Violations are classified as **repairable (in-task) / pre-existing (baseline) / unrepairable** by a Hybrid Classifier (git diff + LLM)
|
|
166
|
+
3. Among repairable violations, the most upstream one in the DAG is selected and an LLM generates a patch
|
|
167
|
+
4. The patch goes through dry-run validation, then is applied and verified again
|
|
168
|
+
5. If all violations are resolved within `max_attempts`, the status is `SUCCESS`; if some are repaired, `PARTIAL_SUCCESS`; if only unrepairable items remain, `REPAIR_FAILED`
|
|
169
|
+
|
|
170
|
+
Even in `PARTIAL_SUCCESS`, repaired patches are kept and remaining violations are listed transparently in the report.
|
|
171
|
+
|
|
172
|
+
### Use Case 3: User Journey Coherence (`codd dag run-journey`)
|
|
173
|
+
|
|
174
|
+
Declare a user journey in the frontmatter of `docs/design/auth_design.md`:
|
|
175
|
+
|
|
176
|
+
```yaml
|
|
177
|
+
user_journeys:
|
|
178
|
+
- name: login_to_dashboard
|
|
179
|
+
criticality: critical
|
|
180
|
+
steps:
|
|
181
|
+
- { action: navigate, target: "/login" }
|
|
182
|
+
- { action: fill, selector: "input[type=email]", value: "user@example.com" }
|
|
183
|
+
- { action: click, selector: "button[type=submit]" }
|
|
184
|
+
- { action: expect_url, value: "/dashboard" }
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
With `codd dag run-journey login_to_dashboard --axis viewport=smartphone_se`:
|
|
188
|
+
|
|
189
|
+
- `viewport=smartphone_se` (375x667), declared in `project_lexicon.yaml`, is injected into runtime through CDP
|
|
190
|
+
- The journey runs in a real browser (Edge / Chrome)
|
|
191
|
+
- If it fails, C9 `environment_coverage` in `codd dag verify` blocks the deploy gate
|
|
192
|
+
|
|
193
|
+
This structurally prevents incidents such as smartphone-only navigation disappearing unnoticed.
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## v1.34.0 Key Features
|
|
198
|
+
|
|
199
|
+
| Feature | Role |
|
|
200
|
+
|---------|------|
|
|
201
|
+
| **DAG Completeness** (C1-C8) | 9 coherence checks across requirements, design, implementation, tests, and deployment |
|
|
202
|
+
| **Coverage Axis Layer** (C9) | Verifies **target environment coverage** such as viewport, RBAC role, and locale through a unified abstraction supporting 16+ axes |
|
|
203
|
+
| **LLM Auto-Repair (RepairLoop)** | Violation detection -> LLM patch generation -> apply -> verify again, attempting full resolution within `max_attempts` |
|
|
204
|
+
| **Hybrid Classifier** | Classifies violations as repairable / pre_existing / unrepairable using git diff (Stage 1) + LLM judgment (Stage 2) |
|
|
205
|
+
| **Primary Picker** | Prioritizes the most upstream violation in the DAG as the likely root cause among multiple violations |
|
|
206
|
+
| **PARTIAL_SUCCESS policy** | Returns PARTIAL_SUCCESS when applied_patches, pre_existing, or unrepairable items exist, avoiding release blockage by transparent non-current-task issues |
|
|
207
|
+
| **BestPracticeAugmenter** | Dynamically fills in best practices that are not explicitly written in design docs, such as password reset |
|
|
208
|
+
| **ImplStepDeriver (2-layer)** | Dynamically expands design docs into ImplStep sequences and infers `required_axes` in Layer 2 |
|
|
209
|
+
| **Typecheck Repair Loop** | Runs an auto-repair loop when a type checker such as `tsc --noEmit` fails during implementation |
|
|
210
|
+
| **`codd version --check --strict`** | Detects differences between the project's required CoDD version and the installed version |
|
|
211
|
+
|
|
212
|
+
See [CHANGELOG.md](CHANGELOG.md) for details.
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Case Study - A Real-World LMS Web App (Next.js + Prisma + PostgreSQL)
|
|
217
|
+
|
|
218
|
+
Result of running `codd verify --auto-repair --max-attempts 10` on a real-world LMS project (Web only, primarily single viewport):
|
|
219
|
+
|
|
220
|
+
```text
|
|
221
|
+
status: PARTIAL_SUCCESS
|
|
222
|
+
attempts: 4
|
|
223
|
+
applied_patches: 4
|
|
224
|
+
pre_existing_violations: 1
|
|
225
|
+
unrepairable_violations: 2
|
|
226
|
+
remaining_violations: 3 (skipped + reported)
|
|
227
|
+
smoke proof: 6 checks PASS
|
|
228
|
+
CoDD core changes: 0 lines
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Repaired files:
|
|
232
|
+
|
|
233
|
+
- `tests/e2e/environment-coverage.spec.ts`
|
|
234
|
+
- `tests/e2e/login.spec.ts`
|
|
235
|
+
|
|
236
|
+
Skipped violations (explicitly reported as outside CoDD's responsibility):
|
|
237
|
+
|
|
238
|
+
- pre_existing: deployment_completeness chain
|
|
239
|
+
- unrepairable: Dockerfile dry-run patch validation
|
|
240
|
+
- unrepairable: Vitest matcher runtime issue
|
|
241
|
+
|
|
242
|
+
C9 `environment_coverage` verified all axis x variant coverage for viewport (smartphone_se / desktop_1920) and RBAC role (central_admin / tenant_admin / learner), and reached PASS.
|
|
243
|
+
|
|
244
|
+
**Scope of this validation**:
|
|
245
|
+
|
|
246
|
+
- ✅ Auto-repair completes `PARTIAL_SUCCESS` on a Next.js + Prisma + TS stack
|
|
247
|
+
- ✅ Project-specific requirements are absorbed with **0 lines of CoDD core changes** (Generality preserved)
|
|
248
|
+
- ⚠️ Single project / single stack dogfooding only; other domains (Mobile / Desktop / CLI / Embedded / ML / Game) are not validated
|
|
249
|
+
- ⚠️ 2 unrepairable items remained = semi-automated, not fully automated
|
|
250
|
+
|
|
251
|
+
---
|
|
252
|
+
|
|
253
|
+
## Architecture - 4-Release Evolution and Next Plans
|
|
254
|
+
|
|
255
|
+
### Achieved (v1.31.0 - v1.34.0)
|
|
256
|
+
|
|
257
|
+
| Release | Milestone |
|
|
258
|
+
|---------|-----------|
|
|
259
|
+
| v1.31.0 | Inner 100% (internal coherence) - eliminated manual type fixes with the typecheck repair loop |
|
|
260
|
+
| v1.32.0 | Outer 100% (target environment coverage Layer C9) - absorbed viewport/RBAC/locale and related axes through a unified abstraction |
|
|
261
|
+
| v1.33.0 | Caveat-resolution path proven - real CDP run-journey + LLM auto-repair attempt passed |
|
|
262
|
+
| **v1.34.0** | **Full pipeline proven** - auto-repair reached PARTIAL_SUCCESS through dogfooding on a single Next.js Web project |
|
|
263
|
+
|
|
264
|
+
### Next (v1.35.0 - v2.0.0, Roadmap)
|
|
265
|
+
|
|
266
|
+
| Release | Plan |
|
|
267
|
+
|---------|------|
|
|
268
|
+
| **v1.35.0** | **`codd elicit`** - Discovery Engine that lets an LLM extract axis candidates and spec holes from requirements |
|
|
269
|
+
| v1.36.0 | BABOK lexicon (`@codd/lexicon/babok`) bundle + multi-formatter (md / json / PR comment) |
|
|
270
|
+
| v1.37.0 | **`codd diff`** - brownfield drift detection between requirements and implementation |
|
|
271
|
+
| v1.38.0 | extract -> diff -> elicit pipeline, complete brownfield flow |
|
|
272
|
+
| v1.39.0 | Reduce unrepairable items (RepairLoop strategy generalization) |
|
|
273
|
+
| v1.40.0 | Multi-domain dogfooding (Mobile / CLI / embedded, etc.) |
|
|
274
|
+
| (v2.0.0) | elicit + verify bidirectional loop, closest approach to the "fully automated" North Star |
|
|
275
|
+
|
|
276
|
+
See [CHANGELOG.md](CHANGELOG.md).
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## North Star Connection: `codd elicit` (v1.35.0)
|
|
281
|
+
|
|
282
|
+
The biggest gap between the North Star ("write only requirements + constraints") and reality has been the assumption that **requirements are complete**. If requirements have holes, so does the implementation, and these surface as pre-demo incidents (e.g., navigation disappearing for central admin on a smartphone viewport).
|
|
283
|
+
|
|
284
|
+
`codd elicit` structurally addresses this:
|
|
285
|
+
|
|
286
|
+
```bash
|
|
287
|
+
$ codd elicit
|
|
288
|
+
[INFO] Reading docs/requirements/requirements.md (483 lines)
|
|
289
|
+
[INFO] Loading project_lexicon.yaml + @codd/lexicon/babok ...
|
|
290
|
+
[INFO] Generated 27 findings (axis_candidates: 11, spec_holes: 16)
|
|
291
|
+
[OK] findings.md created
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
```markdown
|
|
295
|
+
## f-001 [axis_candidate] locale (severity: high)
|
|
296
|
+
**details**: variants: ja_JP, en_US / source: persona description and Section 3.5
|
|
297
|
+
**approved**: yes
|
|
298
|
+
**note**: en_US is phase 2
|
|
299
|
+
|
|
300
|
+
## f-002 [spec_hole] If the browser is closed during video playback, is progress lost? (severity: high)
|
|
301
|
+
**approved**: yes
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
```bash
|
|
305
|
+
$ codd elicit apply findings.md
|
|
306
|
+
[OK] project_lexicon.yaml updated (11 axis sections appended)
|
|
307
|
+
[OK] docs/requirements/requirements.md updated (TODO appended)
|
|
308
|
+
$ git add -A && git commit -m "feat: apply elicit findings"
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
Humans only **review extracted requirements** and **approve / reject elicit findings (Yes/No)**. The rest is AI dynamically diverging and converging.
|
|
312
|
+
|
|
313
|
+
---
|
|
314
|
+
|
|
315
|
+
## Generality Gate (Absolute Generality Preservation)
|
|
316
|
+
|
|
317
|
+
The following hardcoding is **forbidden** in CoDD core code:
|
|
318
|
+
|
|
319
|
+
- Specific stack names (Next.js / Django / Rails / FastAPI, etc.)
|
|
320
|
+
- Specific framework / library literals
|
|
321
|
+
- Specific domains (Web / Mobile / Desktop / CLI / Backend / Embedded)
|
|
322
|
+
- Specific viewport values (375 / 1920, etc.) or device names (iPhone / Android, etc.)
|
|
323
|
+
- Specific axis types (viewport / locale / a11y) or finding kinds (axis_candidate / spec_hole) hardcoded in core
|
|
324
|
+
|
|
325
|
+
All such knowledge is confined to **`project_lexicon.yaml` (project-specific)** or **lexicon plug-ins (`@codd/lexicon/babok`, etc.)**. CoDD handles them only as generic violation/finding objects.
|
|
326
|
+
|
|
327
|
+
When an LLM proposes a stack-specific optimal patch, that judgment is delegated to **the LLM's knowledge**. CoDD core does not decide it, which prevents overfitting.
|
|
328
|
+
|
|
329
|
+
---
|
|
330
|
+
|
|
331
|
+
## Hook Integration
|
|
332
|
+
|
|
333
|
+
CoDD ships hook recipes for editor and Git workflows:
|
|
334
|
+
|
|
335
|
+
- Claude Code `PostToolUse` hook recipe for running CoDD checks after file edits
|
|
336
|
+
- Git `pre-commit` hook recipe for blocking commits when coherence checks fail
|
|
337
|
+
|
|
338
|
+
Recipes live under `codd/hooks/recipes/`.
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## License
|
|
343
|
+
|
|
344
|
+
MIT License - see [LICENSE](LICENSE).
|
|
345
|
+
|
|
346
|
+
## Links
|
|
347
|
+
|
|
348
|
+
- [CHANGELOG.md](CHANGELOG.md) - full release notes
|
|
349
|
+
- [GitHub Sponsors](https://github.com/sponsors/yohey-w) - support development
|
|
350
|
+
- [Issues](https://github.com/yohey-w/codd-dev/issues) - bug reports / feature requests
|
|
351
|
+
|
|
352
|
+
---
|
|
353
|
+
|
|
354
|
+
> When code changes, CoDD traces the impact, detects violations, and produces evidence for merge decisions.
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<strong>CoDD - Coherence-Driven Development</strong>
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<a href="https://pypi.org/project/codd-dev/"><img src="https://img.shields.io/pypi/v/codd-dev?style=flat-square&color=blue" alt="PyPI"></a>
|
|
7
|
+
<a href="https://pypi.org/project/codd-dev/"><img src="https://img.shields.io/pypi/pyversions/codd-dev?style=flat-square" alt="Python"></a>
|
|
8
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green?style=flat-square" alt="License"></a>
|
|
9
|
+
<a href="https://github.com/yohey-w/codd-dev/stargazers"><img src="https://img.shields.io/github/stars/yohey-w/codd-dev?style=flat-square" alt="Stars"></a>
|
|
10
|
+
</p>
|
|
11
|
+
|
|
12
|
+
<p align="center">
|
|
13
|
+
<a href="README_ja.md">日本語</a> | English | <a href="README_zh.md">中文</a>
|
|
14
|
+
</p>
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## North Star (Vision)
|
|
19
|
+
|
|
20
|
+
**"Write only functional requirements and constraints. Code is generated, repaired, and verified automatically."**
|
|
21
|
+
|
|
22
|
+
CoDD treats **requirements -> design -> implementation -> tests** as one DAG, mechanically verifies the coherence of every node, and lets an LLM repair inconsistencies automatically when they appear. Humans write only **what to build** and **where the boundaries are**.
|
|
23
|
+
|
|
24
|
+
## Where We Are (v1.34.0)
|
|
25
|
+
|
|
26
|
+
The North Star is far, but **within bounded conditions, CoDD has reached practical use**:
|
|
27
|
+
|
|
28
|
+
- ✅ Dogfooded on a real project (Next.js + Prisma + TypeScript Web app)
|
|
29
|
+
- ✅ `codd verify --auto-repair` completes with `PARTIAL_SUCCESS` on a real LMS project (attempts=4 / applied_patches=4 / unrepairable=2)
|
|
30
|
+
- ✅ DAG completeness with 9 coherence checks operational
|
|
31
|
+
- ⚠️ Single viewport / single persona assumed (Coverage Axis Layer C9 introduced in v1.32.0; axis variety is continuing work)
|
|
32
|
+
- ⚠️ Specification completeness Level 1 (finding holes in requirements) is planned for v1.35.0 `codd elicit`
|
|
33
|
+
- ⚠️ Other domains (Mobile / Desktop / CLI / Embedded / ML) are not yet validated
|
|
34
|
+
- ⚠️ Reducing unrepairable items is continuing improvement
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pip install codd-dev
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## Quick Start (5 min)
|
|
43
|
+
|
|
44
|
+
### 1. Install
|
|
45
|
+
|
|
46
|
+
```bash
|
|
47
|
+
pip install codd-dev
|
|
48
|
+
codd --version # 1.34.0 or later
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
### 2. Add codd.yaml to your project
|
|
52
|
+
|
|
53
|
+
```yaml
|
|
54
|
+
# codd.yaml
|
|
55
|
+
codd_required_version: ">=1.34.0"
|
|
56
|
+
|
|
57
|
+
dag:
|
|
58
|
+
design_docs:
|
|
59
|
+
- "docs/design/**/*.md"
|
|
60
|
+
implementations:
|
|
61
|
+
- "src/**/*.{ts,tsx,py}"
|
|
62
|
+
tests:
|
|
63
|
+
- "tests/**/*.{spec,test}.{ts,tsx,py}"
|
|
64
|
+
|
|
65
|
+
repair:
|
|
66
|
+
approval_mode: required # automatic repair requires human approval
|
|
67
|
+
max_attempts: 10
|
|
68
|
+
|
|
69
|
+
llm:
|
|
70
|
+
ai_command: "claude" # any LLM CLI can be invoked (claude / codex / gemini, etc.)
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 3. Common commands
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
# Coherence verification (checks consistency across requirements, design, implementation, and tests)
|
|
77
|
+
codd dag verify
|
|
78
|
+
|
|
79
|
+
# Verification with auto-repair (when violations are found, an LLM generates and applies patches)
|
|
80
|
+
codd dag verify --auto-repair --max-attempts 10
|
|
81
|
+
|
|
82
|
+
# Confirm User Journey PASS in a real browser (browser control via CDP)
|
|
83
|
+
codd dag run-journey login_to_dashboard --axis viewport=smartphone_se
|
|
84
|
+
|
|
85
|
+
# Derive implementation steps from design docs (input to the implementation phase)
|
|
86
|
+
codd implement run --task M1.2 --enable-typecheck-loop
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
### 4. Reading the output
|
|
90
|
+
|
|
91
|
+
`codd dag verify` runs 9 coherence checks:
|
|
92
|
+
|
|
93
|
+
| Check | Role |
|
|
94
|
+
|-------|------|
|
|
95
|
+
| `node_completeness` | Confirms nodes declared in design docs (implementation/test files) exist as physical files |
|
|
96
|
+
| `transitive_closure` | Confirms the dependency chain from requirements -> design -> implementation -> tests is closed |
|
|
97
|
+
| `verification_test_runtime` | Confirms tests for implementations can run and pass |
|
|
98
|
+
| `deployment_completeness` | Confirms the deployment chain (Dockerfile/compose/k8s) is complete |
|
|
99
|
+
| `proof_break_authority` | Confirms critical journeys are not broken |
|
|
100
|
+
| `screen_flow_edges` | Detects isolated nodes in the screen transition graph |
|
|
101
|
+
| `screen_flow_completeness` | Confirms every screen is mapped to requirements |
|
|
102
|
+
| `c8` | Detects uncommitted patches / dirty files |
|
|
103
|
+
| `c9` (`environment_coverage`) | Confirms **target environment coverage** such as viewport, RBAC role, and locale |
|
|
104
|
+
|
|
105
|
+
When violations are found, the deploy gate is blocked. With `--auto-repair`, CoDD enters a loop that asks an LLM to generate patches, applies them, and verifies again.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Typical Use Cases
|
|
110
|
+
|
|
111
|
+
### Use Case 1: Automating requirements -> design -> implementation
|
|
112
|
+
|
|
113
|
+
Write "functional requirements + constraints" in `docs/requirements/*.md`, then run `codd implement run`:
|
|
114
|
+
|
|
115
|
+
1. An LLM dynamically derives ImplStep sequences from the requirements (Layer 1)
|
|
116
|
+
2. Best-practice gaps are filled in (Layer 2, such as logout, Remember Me, and session timeout for login)
|
|
117
|
+
3. After user approval through a HITL gate, implementation is generated into `src/**`
|
|
118
|
+
4. If a type checker such as `tsc` fails during generation, CoDD enters the auto-repair loop
|
|
119
|
+
|
|
120
|
+
### Use Case 2: Auto-Repair (`codd verify --auto-repair`)
|
|
121
|
+
|
|
122
|
+
Run `codd dag verify --auto-repair --max-attempts 10` in CI:
|
|
123
|
+
|
|
124
|
+
1. 9 coherence checks are executed
|
|
125
|
+
2. Violations are classified as **repairable (in-task) / pre-existing (baseline) / unrepairable** by a Hybrid Classifier (git diff + LLM)
|
|
126
|
+
3. Among repairable violations, the most upstream one in the DAG is selected and an LLM generates a patch
|
|
127
|
+
4. The patch goes through dry-run validation, then is applied and verified again
|
|
128
|
+
5. If all violations are resolved within `max_attempts`, the status is `SUCCESS`; if some are repaired, `PARTIAL_SUCCESS`; if only unrepairable items remain, `REPAIR_FAILED`
|
|
129
|
+
|
|
130
|
+
Even in `PARTIAL_SUCCESS`, repaired patches are kept and remaining violations are listed transparently in the report.
|
|
131
|
+
|
|
132
|
+
### Use Case 3: User Journey Coherence (`codd dag run-journey`)
|
|
133
|
+
|
|
134
|
+
Declare a user journey in the frontmatter of `docs/design/auth_design.md`:
|
|
135
|
+
|
|
136
|
+
```yaml
|
|
137
|
+
user_journeys:
|
|
138
|
+
- name: login_to_dashboard
|
|
139
|
+
criticality: critical
|
|
140
|
+
steps:
|
|
141
|
+
- { action: navigate, target: "/login" }
|
|
142
|
+
- { action: fill, selector: "input[type=email]", value: "user@example.com" }
|
|
143
|
+
- { action: click, selector: "button[type=submit]" }
|
|
144
|
+
- { action: expect_url, value: "/dashboard" }
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
With `codd dag run-journey login_to_dashboard --axis viewport=smartphone_se`:
|
|
148
|
+
|
|
149
|
+
- `viewport=smartphone_se` (375x667), declared in `project_lexicon.yaml`, is injected into runtime through CDP
|
|
150
|
+
- The journey runs in a real browser (Edge / Chrome)
|
|
151
|
+
- If it fails, C9 `environment_coverage` in `codd dag verify` blocks the deploy gate
|
|
152
|
+
|
|
153
|
+
This structurally prevents incidents such as smartphone-only navigation disappearing unnoticed.
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## v1.34.0 Key Features
|
|
158
|
+
|
|
159
|
+
| Feature | Role |
|
|
160
|
+
|---------|------|
|
|
161
|
+
| **DAG Completeness** (C1-C8) | 9 coherence checks across requirements, design, implementation, tests, and deployment |
|
|
162
|
+
| **Coverage Axis Layer** (C9) | Verifies **target environment coverage** such as viewport, RBAC role, and locale through a unified abstraction supporting 16+ axes |
|
|
163
|
+
| **LLM Auto-Repair (RepairLoop)** | Violation detection -> LLM patch generation -> apply -> verify again, attempting full resolution within `max_attempts` |
|
|
164
|
+
| **Hybrid Classifier** | Classifies violations as repairable / pre_existing / unrepairable using git diff (Stage 1) + LLM judgment (Stage 2) |
|
|
165
|
+
| **Primary Picker** | Prioritizes the most upstream violation in the DAG as the likely root cause among multiple violations |
|
|
166
|
+
| **PARTIAL_SUCCESS policy** | Returns PARTIAL_SUCCESS when applied_patches, pre_existing, or unrepairable items exist, avoiding release blockage by transparent non-current-task issues |
|
|
167
|
+
| **BestPracticeAugmenter** | Dynamically fills in best practices that are not explicitly written in design docs, such as password reset |
|
|
168
|
+
| **ImplStepDeriver (2-layer)** | Dynamically expands design docs into ImplStep sequences and infers `required_axes` in Layer 2 |
|
|
169
|
+
| **Typecheck Repair Loop** | Runs an auto-repair loop when a type checker such as `tsc --noEmit` fails during implementation |
|
|
170
|
+
| **`codd version --check --strict`** | Detects differences between the project's required CoDD version and the installed version |
|
|
171
|
+
|
|
172
|
+
See [CHANGELOG.md](CHANGELOG.md) for details.
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## Case Study - A Real-World LMS Web App (Next.js + Prisma + PostgreSQL)
|
|
177
|
+
|
|
178
|
+
Result of running `codd verify --auto-repair --max-attempts 10` on a real-world LMS project (Web only, primarily single viewport):
|
|
179
|
+
|
|
180
|
+
```text
|
|
181
|
+
status: PARTIAL_SUCCESS
|
|
182
|
+
attempts: 4
|
|
183
|
+
applied_patches: 4
|
|
184
|
+
pre_existing_violations: 1
|
|
185
|
+
unrepairable_violations: 2
|
|
186
|
+
remaining_violations: 3 (skipped + reported)
|
|
187
|
+
smoke proof: 6 checks PASS
|
|
188
|
+
CoDD core changes: 0 lines
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Repaired files:
|
|
192
|
+
|
|
193
|
+
- `tests/e2e/environment-coverage.spec.ts`
|
|
194
|
+
- `tests/e2e/login.spec.ts`
|
|
195
|
+
|
|
196
|
+
Skipped violations (explicitly reported as outside CoDD's responsibility):
|
|
197
|
+
|
|
198
|
+
- pre_existing: deployment_completeness chain
|
|
199
|
+
- unrepairable: Dockerfile dry-run patch validation
|
|
200
|
+
- unrepairable: Vitest matcher runtime issue
|
|
201
|
+
|
|
202
|
+
C9 `environment_coverage` verified all axis x variant coverage for viewport (smartphone_se / desktop_1920) and RBAC role (central_admin / tenant_admin / learner), and reached PASS.
|
|
203
|
+
|
|
204
|
+
**Scope of this validation**:
|
|
205
|
+
|
|
206
|
+
- ✅ Auto-repair completes `PARTIAL_SUCCESS` on a Next.js + Prisma + TS stack
|
|
207
|
+
- ✅ Project-specific requirements are absorbed with **0 lines of CoDD core changes** (Generality preserved)
|
|
208
|
+
- ⚠️ Single project / single stack dogfooding only; other domains (Mobile / Desktop / CLI / Embedded / ML / Game) are not validated
|
|
209
|
+
- ⚠️ 2 unrepairable items remained = semi-automated, not fully automated
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Architecture - 4-Release Evolution and Next Plans
|
|
214
|
+
|
|
215
|
+
### Achieved (v1.31.0 - v1.34.0)
|
|
216
|
+
|
|
217
|
+
| Release | Milestone |
|
|
218
|
+
|---------|-----------|
|
|
219
|
+
| v1.31.0 | Inner 100% (internal coherence) - eliminated manual type fixes with the typecheck repair loop |
|
|
220
|
+
| v1.32.0 | Outer 100% (target environment coverage Layer C9) - absorbed viewport/RBAC/locale and related axes through a unified abstraction |
|
|
221
|
+
| v1.33.0 | Caveat-resolution path proven - real CDP run-journey + LLM auto-repair attempt passed |
|
|
222
|
+
| **v1.34.0** | **Full pipeline proven** - auto-repair reached PARTIAL_SUCCESS through dogfooding on a single Next.js Web project |
|
|
223
|
+
|
|
224
|
+
### Next (v1.35.0 - v2.0.0, Roadmap)
|
|
225
|
+
|
|
226
|
+
| Release | Plan |
|
|
227
|
+
|---------|------|
|
|
228
|
+
| **v1.35.0** | **`codd elicit`** - Discovery Engine that lets an LLM extract axis candidates and spec holes from requirements |
|
|
229
|
+
| v1.36.0 | BABOK lexicon (`@codd/lexicon/babok`) bundle + multi-formatter (md / json / PR comment) |
|
|
230
|
+
| v1.37.0 | **`codd diff`** - brownfield drift detection between requirements and implementation |
|
|
231
|
+
| v1.38.0 | extract -> diff -> elicit pipeline, complete brownfield flow |
|
|
232
|
+
| v1.39.0 | Reduce unrepairable items (RepairLoop strategy generalization) |
|
|
233
|
+
| v1.40.0 | Multi-domain dogfooding (Mobile / CLI / embedded, etc.) |
|
|
234
|
+
| (v2.0.0) | elicit + verify bidirectional loop, closest approach to the "fully automated" North Star |
|
|
235
|
+
|
|
236
|
+
See [CHANGELOG.md](CHANGELOG.md).
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
240
|
+
## North Star Connection: `codd elicit` (v1.35.0)
|
|
241
|
+
|
|
242
|
+
The biggest gap between the North Star ("write only requirements + constraints") and reality has been the assumption that **requirements are complete**. If requirements have holes, so does the implementation, and these surface as pre-demo incidents (e.g., navigation disappearing for central admin on a smartphone viewport).
|
|
243
|
+
|
|
244
|
+
`codd elicit` structurally addresses this:
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
$ codd elicit
|
|
248
|
+
[INFO] Reading docs/requirements/requirements.md (483 lines)
|
|
249
|
+
[INFO] Loading project_lexicon.yaml + @codd/lexicon/babok ...
|
|
250
|
+
[INFO] Generated 27 findings (axis_candidates: 11, spec_holes: 16)
|
|
251
|
+
[OK] findings.md created
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
```markdown
|
|
255
|
+
## f-001 [axis_candidate] locale (severity: high)
|
|
256
|
+
**details**: variants: ja_JP, en_US / source: persona description and Section 3.5
|
|
257
|
+
**approved**: yes
|
|
258
|
+
**note**: en_US is phase 2
|
|
259
|
+
|
|
260
|
+
## f-002 [spec_hole] If the browser is closed during video playback, is progress lost? (severity: high)
|
|
261
|
+
**approved**: yes
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
$ codd elicit apply findings.md
|
|
266
|
+
[OK] project_lexicon.yaml updated (11 axis sections appended)
|
|
267
|
+
[OK] docs/requirements/requirements.md updated (TODO appended)
|
|
268
|
+
$ git add -A && git commit -m "feat: apply elicit findings"
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Humans only **review extracted requirements** and **approve / reject elicit findings (Yes/No)**. The rest is AI dynamically diverging and converging.
|
|
272
|
+
|
|
273
|
+
---
|
|
274
|
+
|
|
275
|
+
## Generality Gate (Absolute Generality Preservation)
|
|
276
|
+
|
|
277
|
+
The following hardcoding is **forbidden** in CoDD core code:
|
|
278
|
+
|
|
279
|
+
- Specific stack names (Next.js / Django / Rails / FastAPI, etc.)
|
|
280
|
+
- Specific framework / library literals
|
|
281
|
+
- Specific domains (Web / Mobile / Desktop / CLI / Backend / Embedded)
|
|
282
|
+
- Specific viewport values (375 / 1920, etc.) or device names (iPhone / Android, etc.)
|
|
283
|
+
- Specific axis types (viewport / locale / a11y) or finding kinds (axis_candidate / spec_hole) hardcoded in core
|
|
284
|
+
|
|
285
|
+
All such knowledge is confined to **`project_lexicon.yaml` (project-specific)** or **lexicon plug-ins (`@codd/lexicon/babok`, etc.)**. CoDD handles them only as generic violation/finding objects.
|
|
286
|
+
|
|
287
|
+
When an LLM proposes a stack-specific optimal patch, that judgment is delegated to **the LLM's knowledge**. CoDD core does not decide it, which prevents overfitting.
|
|
288
|
+
|
|
289
|
+
---
|
|
290
|
+
|
|
291
|
+
## Hook Integration
|
|
292
|
+
|
|
293
|
+
CoDD ships hook recipes for editor and Git workflows:
|
|
294
|
+
|
|
295
|
+
- Claude Code `PostToolUse` hook recipe for running CoDD checks after file edits
|
|
296
|
+
- Git `pre-commit` hook recipe for blocking commits when coherence checks fail
|
|
297
|
+
|
|
298
|
+
Recipes live under `codd/hooks/recipes/`.
|
|
299
|
+
|
|
300
|
+
---
|
|
301
|
+
|
|
302
|
+
## License
|
|
303
|
+
|
|
304
|
+
MIT License - see [LICENSE](LICENSE).
|
|
305
|
+
|
|
306
|
+
## Links
|
|
307
|
+
|
|
308
|
+
- [CHANGELOG.md](CHANGELOG.md) - full release notes
|
|
309
|
+
- [GitHub Sponsors](https://github.com/sponsors/yohey-w) - support development
|
|
310
|
+
- [Issues](https://github.com/yohey-w/codd-dev/issues) - bug reports / feature requests
|
|
311
|
+
|
|
312
|
+
---
|
|
313
|
+
|
|
314
|
+
> When code changes, CoDD traces the impact, detects violations, and produces evidence for merge decisions.
|