deviatdd 2.21.2__tar.gz → 2.23.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.
Files changed (480) hide show
  1. deviatdd-2.23.0/.deviate/config.toml +20 -0
  2. deviatdd-2.23.0/.github/workflows/release.yml +86 -0
  3. {deviatdd-2.21.2 → deviatdd-2.23.0}/CHANGELOG.md +13 -0
  4. {deviatdd-2.21.2 → deviatdd-2.23.0}/CONTRIBUTING.md +31 -7
  5. {deviatdd-2.21.2 → deviatdd-2.23.0}/PKG-INFO +1 -1
  6. {deviatdd-2.21.2 → deviatdd-2.23.0}/pyproject.toml +1 -1
  7. deviatdd-2.23.0/scripts/next_version.py +262 -0
  8. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/DeviaTDD-api.md +46 -10
  9. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/DeviaTDD-architecture.md +17 -9
  10. deviatdd-2.23.0/specs/adhoc/031-judge-revert-boundary-no-failing-test/plan.md +149 -0
  11. deviatdd-2.23.0/specs/adhoc/031-judge-revert-boundary-no-failing-test/tasks.jsonl +5 -0
  12. deviatdd-2.23.0/specs/adhoc/031-judge-revert-boundary-no-failing-test/tasks.md +118 -0
  13. deviatdd-2.23.0/specs/adhoc/issues/029-ponytail-pruning-in-review.md +126 -0
  14. deviatdd-2.23.0/specs/adhoc/issues/030-config-rework.md +87 -0
  15. deviatdd-2.23.0/specs/adhoc/issues/031-judge-revert-boundary-no-failing-test.md +78 -0
  16. deviatdd-2.23.0/specs/adhoc/issues/032-judge-feedback-injection-fail-close.md +75 -0
  17. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/prd.md +55 -0
  18. deviatdd-2.23.0/specs/explore/config-rework.md +134 -0
  19. deviatdd-2.23.0/specs/explore/ponytail-pruning.md +136 -0
  20. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/issues.jsonl +6 -0
  21. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/inspect.py +6 -4
  22. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/meso.py +22 -7
  23. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/micro.py +458 -20
  24. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/agent.py +71 -2
  25. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/issues.py +6 -5
  26. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/judge_evidence.py +8 -2
  27. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/review_coverage.py +2 -0
  28. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/worktree.py +4 -2
  29. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/judge.md +1 -1
  30. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-judge.md +3 -1
  31. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/skills/deviatdd/SKILL.md +22 -5
  32. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/state/config.py +3 -0
  33. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/state/ledger.py +63 -5
  34. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/conftest.py +6 -1
  35. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_inspect.py +67 -0
  36. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_micro.py +129 -0
  37. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_agent.py +65 -0
  38. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_issues.py +29 -0
  39. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_worktree.py +45 -0
  40. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_meso_orchestration.py +51 -0
  41. deviatdd-2.23.0/tests/test_micro/test_completed_evidence.py +293 -0
  42. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_judge.py +823 -1
  43. deviatdd-2.23.0/tests/test_micro/test_review_pause.py +396 -0
  44. deviatdd-2.23.0/tests/test_release/test_next_version.py +225 -0
  45. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_state/test_ledger.py +134 -0
  46. {deviatdd-2.21.2 → deviatdd-2.23.0}/uv.lock +1 -1
  47. deviatdd-2.21.2/.deviate/config.toml +0 -16
  48. deviatdd-2.21.2/.opencode/.gitignore +0 -5
  49. deviatdd-2.21.2/.worktrees/feat/005-acceptance-gates/003-micro-phase-gates-red-green/.env.example +0 -8
  50. deviatdd-2.21.2/.worktrees/feat/adhoc/012-rpc-streaming-tui-renderer/.env.example +0 -8
  51. deviatdd-2.21.2/.worktrees/feat/adhoc/014-cwe-mapping-security-findings/.env.example +0 -8
  52. deviatdd-2.21.2/.worktrees/feat/adhoc/016-single-source-prompt-templates/.env.example +0 -8
  53. deviatdd-2.21.2/.worktrees/work/.env.example +0 -8
  54. {deviatdd-2.21.2 → deviatdd-2.23.0}/.deviate/.gitignore +0 -0
  55. {deviatdd-2.21.2 → deviatdd-2.23.0}/.deviate/evaluations/deviate-flows-skill-2026-06-26.json +0 -0
  56. {deviatdd-2.21.2 → deviatdd-2.23.0}/.env.example +0 -0
  57. {deviatdd-2.21.2 → deviatdd-2.23.0}/.gitattributes +0 -0
  58. {deviatdd-2.21.2 → deviatdd-2.23.0}/.githooks/pre-commit +0 -0
  59. {deviatdd-2.21.2 → deviatdd-2.23.0}/.githooks/pre-push +0 -0
  60. {deviatdd-2.21.2 → deviatdd-2.23.0}/.github/ISSUE_TEMPLATE/bug.md +0 -0
  61. {deviatdd-2.21.2 → deviatdd-2.23.0}/.github/ISSUE_TEMPLATE/feature.md +0 -0
  62. {deviatdd-2.21.2 → deviatdd-2.23.0}/.github/PULL_REQUEST_TEMPLATE.md +0 -0
  63. {deviatdd-2.21.2 → deviatdd-2.23.0}/.github/workflows/ci.yml +0 -0
  64. {deviatdd-2.21.2 → deviatdd-2.23.0}/.gitignore +0 -0
  65. {deviatdd-2.21.2 → deviatdd-2.23.0}/.opencode/opencode.json +0 -0
  66. {deviatdd-2.21.2 → deviatdd-2.23.0}/AGENTS.md +0 -0
  67. {deviatdd-2.21.2 → deviatdd-2.23.0}/CLAUDE.md +0 -0
  68. {deviatdd-2.21.2 → deviatdd-2.23.0}/CODE_OF_CONDUCT.md +0 -0
  69. {deviatdd-2.21.2 → deviatdd-2.23.0}/LICENSE +0 -0
  70. {deviatdd-2.21.2 → deviatdd-2.23.0}/README.md +0 -0
  71. {deviatdd-2.21.2 → deviatdd-2.23.0}/SECURITY.md +0 -0
  72. {deviatdd-2.21.2 → deviatdd-2.23.0}/deviatdd.png +0 -0
  73. {deviatdd-2.21.2 → deviatdd-2.23.0}/mise.toml +0 -0
  74. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat/001-deviate-cli-python/008-meso-macro-automated-orchestration.md +0 -0
  75. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat/adhoc/006-context-cli-integration.md +0 -0
  76. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat/adhoc/017-optional-push-as-lock.md +0 -0
  77. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-001-deviate-cli-python-001-cli-initialization-governance-provisioning-pr-11.md +0 -0
  78. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-001-deviate-cli-python-003-meso-layer-specification-task-decomposition.md +0 -0
  79. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-001-deviate-cli-python-004-micro-layer-tdd-sandbox-execution.md +0 -0
  80. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-001-deviate-cli-python-005-cli-architecture-realignment-skill-integration.md +0 -0
  81. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-001-deviate-cli-python-007-macro-meso-parity-backward-compatibility.md +0 -0
  82. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-002-deviatdd-gap-analysis-001-foundation-cli-infrastructure.md +0 -0
  83. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-002-deviatdd-gap-analysis-003-fast-path-commands.md +0 -0
  84. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-002-deviatdd-gap-analysis-004-governance-inspection.md +0 -0
  85. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-adhoc-001-streaming-pipeline-monitor.md +0 -0
  86. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-adhoc-008-ast-phase-prioritization.md +0 -0
  87. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat-adhoc-017-two-counter-tdd-retry.md +0 -0
  88. {deviatdd-2.21.2 → deviatdd-2.23.0}/pr_descriptions/feat_002-deviatdd-gap-analysis_001-foundation-cli-infrastructure.md +0 -0
  89. {deviatdd-2.21.2 → deviatdd-2.23.0}/scripts/benchmark_lmstudio.py +0 -0
  90. {deviatdd-2.21.2 → deviatdd-2.23.0}/scripts/verify_install.py +0 -0
  91. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/001-cli-initialization-governance-provisioning/manifest-t001.json +0 -0
  92. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/001-cli-initialization-governance-provisioning/manifest-t002.json +0 -0
  93. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/001-cli-initialization-governance-provisioning/manifest-t004.json +0 -0
  94. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/001-cli-initialization-governance-provisioning/spec.md +0 -0
  95. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/001-cli-initialization-governance-provisioning/tasks.md +0 -0
  96. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/002-macro-layer-state-ledger-management/spec.md +0 -0
  97. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/002-macro-layer-state-ledger-management/tasks.md +0 -0
  98. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/003-meso-layer-specification-task-decomposition/spec.md +0 -0
  99. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/003-meso-layer-specification-task-decomposition/tasks.md +0 -0
  100. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/004-micro-layer-tdd-sandbox-execution/spec.md +0 -0
  101. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/004-micro-layer-tdd-sandbox-execution/tasks.jsonl +0 -0
  102. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/004-micro-layer-tdd-sandbox-execution/tasks.md +0 -0
  103. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/005-cli-architecture-realignment-skill-integration/spec.md +0 -0
  104. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/005-cli-architecture-realignment-skill-integration/tasks.md +0 -0
  105. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/007-macro-meso-parity-backward-compatibility/spec.md +0 -0
  106. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/007-macro-meso-parity-backward-compatibility/tasks.md +0 -0
  107. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/008-meso-macro-automated-orchestration/spec.md +0 -0
  108. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/008-meso-macro-automated-orchestration/tasks.jsonl +0 -0
  109. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/008-meso-macro-automated-orchestration/tasks.md +0 -0
  110. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/data-model.md +0 -0
  111. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/design.md +0 -0
  112. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/explore.md +0 -0
  113. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/001-cli-initialization-governance-provisioning.md +0 -0
  114. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/002-macro-layer-state-ledger-management.md +0 -0
  115. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/003-meso-layer-specification-task-decomposition.md +0 -0
  116. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/004-micro-layer-tdd-sandbox-execution.md +0 -0
  117. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/005-cli-architecture-realignment-skill-integration.md +0 -0
  118. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/006-state-persistence-concurrency-safety.md +0 -0
  119. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/007-macro-meso-parity-backward-compatibility.md +0 -0
  120. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/issues/008-meso-macro-automated-orchestration.md +0 -0
  121. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/001-deviate-cli-python/prd.md +0 -0
  122. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/001-foundation-cli-infrastructure/spec.md +0 -0
  123. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/001-foundation-cli-infrastructure/tasks.jsonl +0 -0
  124. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/001-foundation-cli-infrastructure/tasks.md +0 -0
  125. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/003-fast-path-commands/spec.md +0 -0
  126. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/003-fast-path-commands/tasks.jsonl +0 -0
  127. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/003-fast-path-commands/tasks.md +0 -0
  128. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/004-governance-inspection/spec.md +0 -0
  129. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/004-governance-inspection/tasks.jsonl +0 -0
  130. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/004-governance-inspection/tasks.md +0 -0
  131. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/005-micro-layer-integrity/spec.md +0 -0
  132. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/005-micro-layer-integrity/tasks.jsonl +0 -0
  133. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/005-micro-layer-integrity/tasks.md +0 -0
  134. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/data-model.md +0 -0
  135. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/design.md +0 -0
  136. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/explore.md +0 -0
  137. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/issues/001-foundation-cli-infrastructure.md +0 -0
  138. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/issues/002-context-pipeline.md +0 -0
  139. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/issues/003-fast-path-commands.md +0 -0
  140. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/issues/004-governance-inspection.md +0 -0
  141. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/issues/005-micro-layer-integrity.md +0 -0
  142. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/plan-tdd-integration-gap.md +0 -0
  143. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/002-deviatdd-gap-analysis/prd.md +0 -0
  144. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/003-graphite-cli-integration/explore.md +0 -0
  145. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/004-per-task-security-profile/issues/001-security-profile-and-judge-checks.md +0 -0
  146. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/001-verification-mode-metadata/plan.md +0 -0
  147. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/001-verification-mode-metadata/tasks.jsonl +0 -0
  148. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/001-verification-mode-metadata/tasks.md +0 -0
  149. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/002-task-acceptance-traceability/plan.md +0 -0
  150. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/002-task-acceptance-traceability/tasks.jsonl +0 -0
  151. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/002-task-acceptance-traceability/tasks.md +0 -0
  152. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/data-model.md +0 -0
  153. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/design.md +0 -0
  154. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/explore.md +0 -0
  155. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/issues/001-verification-mode-metadata.md +0 -0
  156. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/issues/002-task-acceptance-traceability.md +0 -0
  157. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/issues/003-micro-phase-gates-red-green.md +0 -0
  158. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/issues/004-refactor-regression-gate.md +0 -0
  159. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/issues/005-prompt-spec-alignment.md +0 -0
  160. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/005-acceptance-gates/prd.md +0 -0
  161. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/architecture.md +0 -0
  162. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/domain-model.md +0 -0
  163. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/flows/flows-product.md +0 -0
  164. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/flows/flows-streaming.md +0 -0
  165. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/flows/index.md +0 -0
  166. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/flows.jsonl +0 -0
  167. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/guildwright-current-system.md +0 -0
  168. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/guildwright-gap-register.md +0 -0
  169. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/guildwright-git-state-model.md +0 -0
  170. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/guildwright-rewrite.md +0 -0
  171. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/guildwright-rust-tui-requirements.md +0 -0
  172. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/_product/release-next.md +0 -0
  173. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/001-streaming-pipeline-monitor/spec.md +0 -0
  174. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/001-streaming-pipeline-monitor/tasks.jsonl +0 -0
  175. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/001-streaming-pipeline-monitor/tasks.md +0 -0
  176. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/003-meso-layer-restructuring/spec.md +0 -0
  177. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/003-meso-layer-restructuring/tasks.jsonl +0 -0
  178. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/003-meso-layer-restructuring/tasks.md +0 -0
  179. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/004-deviate-review-skill/spec.md +0 -0
  180. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/004-deviate-review-skill/tasks.jsonl +0 -0
  181. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/004-deviate-review-skill/tasks.md +0 -0
  182. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/005-per-phase-model-configuration/plan.md +0 -0
  183. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/005-per-phase-model-configuration/tasks.jsonl +0 -0
  184. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/005-per-phase-model-configuration/tasks.md +0 -0
  185. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/006-context-cli-integration/plan.md +0 -0
  186. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/006-context-cli-integration/tasks.jsonl +0 -0
  187. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/006-context-cli-integration/tasks.md +0 -0
  188. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/007-graphite-cli/plan.md +0 -0
  189. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/007-graphite-cli/tasks.jsonl +0 -0
  190. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/007-graphite-cli/tasks.md +0 -0
  191. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/008-ast-phase-prioritization/plan.md +0 -0
  192. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/008-ast-phase-prioritization/tasks.jsonl +0 -0
  193. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/008-ast-phase-prioritization/tasks.md +0 -0
  194. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/009-pi-agent-backend-integration/plan.md +0 -0
  195. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/009-pi-agent-backend-integration/tasks.jsonl +0 -0
  196. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/009-pi-agent-backend-integration/tasks.md +0 -0
  197. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/010-deviate-setup-product-layer/plan.md +0 -0
  198. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/010-deviate-setup-product-layer/tasks.jsonl +0 -0
  199. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/010-deviate-setup-product-layer/tasks.md +0 -0
  200. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/013-flow-ledger-canonical-source-of-truth/plan.md +0 -0
  201. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/013-flow-ledger-canonical-source-of-truth/tasks.jsonl +0 -0
  202. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/013-flow-ledger-canonical-source-of-truth/tasks.md +0 -0
  203. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/015-narrow-product-flow-scope/plan.md +0 -0
  204. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/015-narrow-product-flow-scope/tasks.md +0 -0
  205. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/016-single-source-prompt-templates/plan.md +0 -0
  206. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/016-single-source-prompt-templates/tasks.jsonl +0 -0
  207. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/016-single-source-prompt-templates/tasks.md +0 -0
  208. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/017-optional-push-as-lock/plan.md +0 -0
  209. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/017-optional-push-as-lock/tasks.jsonl +0 -0
  210. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/017-optional-push-as-lock/tasks.md +0 -0
  211. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/017-two-counter-tdd-retry/plan.md +0 -0
  212. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/017-two-counter-tdd-retry/tasks.jsonl +0 -0
  213. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/017-two-counter-tdd-retry/tasks.md +0 -0
  214. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/018-one-behavior-rgr-granularity/plan.md +0 -0
  215. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/018-one-behavior-rgr-granularity/tasks.md +0 -0
  216. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/019-remote-aware-ordinal-allocation/plan.md +0 -0
  217. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/019-remote-aware-ordinal-allocation/tasks.jsonl +0 -0
  218. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/019-remote-aware-ordinal-allocation/tasks.md +0 -0
  219. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/020-judge-compliance-pass-evidence/plan.md +0 -0
  220. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/020-judge-compliance-pass-evidence/tasks.jsonl +0 -0
  221. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/020-judge-compliance-pass-evidence/tasks.md +0 -0
  222. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/021-no-failing-test-escalate-invokes-green/plan.md +0 -0
  223. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/021-no-failing-test-escalate-invokes-green/tasks.jsonl +0 -0
  224. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/021-no-failing-test-escalate-invokes-green/tasks.md +0 -0
  225. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/022-already-satisfied-red-requires-tests/plan.md +0 -0
  226. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/022-already-satisfied-red-requires-tests/tasks.jsonl +0 -0
  227. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/022-already-satisfied-red-requires-tests/tasks.md +0 -0
  228. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/023-pinned-micro-run-issue-scoped/plan.md +0 -0
  229. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/023-pinned-micro-run-issue-scoped/tasks.jsonl +0 -0
  230. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/023-pinned-micro-run-issue-scoped/tasks.md +0 -0
  231. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/024-worktree-session-stale-issue-id/plan.md +0 -0
  232. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/024-worktree-session-stale-issue-id/tasks.jsonl +0 -0
  233. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/024-worktree-session-stale-issue-id/tasks.md +0 -0
  234. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/025-green-stderr-noise-stall-detector/plan.md +0 -0
  235. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/025-green-stderr-noise-stall-detector/tasks.jsonl +0 -0
  236. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/025-green-stderr-noise-stall-detector/tasks.md +0 -0
  237. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/026-pi-spawn-lean-tool-schema/plan.md +0 -0
  238. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/026-pi-spawn-lean-tool-schema/tasks.jsonl +0 -0
  239. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/026-pi-spawn-lean-tool-schema/tasks.md +0 -0
  240. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/027-red-hang-timeout-rollback/plan.md +0 -0
  241. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/027-red-hang-timeout-rollback/tasks.jsonl +0 -0
  242. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/027-red-hang-timeout-rollback/tasks.md +0 -0
  243. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/028-task-scoped-judge-review-coverage/plan.md +0 -0
  244. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/028-task-scoped-judge-review-coverage/tasks.jsonl +0 -0
  245. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/028-task-scoped-judge-review-coverage/tasks.md +0 -0
  246. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/001-streaming-pipeline-monitor.md +0 -0
  247. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/002-aider-agent-backend-integration.md +0 -0
  248. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/003-meso-layer-restructuring.md +0 -0
  249. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/004-deviate-review-skill.md +0 -0
  250. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/005-per-phase-model-configuration.md +0 -0
  251. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/006-context-cli-integration.md +0 -0
  252. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/007-graphite-cli.md +0 -0
  253. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/008-ast-phase-prioritization.md +0 -0
  254. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/009-pi-agent-backend-integration.md +0 -0
  255. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/010-deviate-setup-product-layer.md +0 -0
  256. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/012-rpc-streaming-tui-renderer.md +0 -0
  257. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/013-flow-ledger-canonical-source-of-truth.md +0 -0
  258. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/014-cwe-mapping-security-findings.md +0 -0
  259. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/015-narrow-product-flow-scope.md +0 -0
  260. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/016-single-source-prompt-templates.md +0 -0
  261. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/017-optional-push-as-lock.md +0 -0
  262. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/017-two-counter-tdd-retry.md +0 -0
  263. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/018-one-behavior-rgr-granularity.md +0 -0
  264. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/019-remote-aware-ordinal-allocation.md +0 -0
  265. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/020-judge-compliance-pass-evidence.md +0 -0
  266. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/021-no-failing-test-escalate-invokes-green.md +0 -0
  267. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/022-already-satisfied-red-requires-tests.md +0 -0
  268. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/023-pinned-micro-run-issue-scoped.md +0 -0
  269. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/024-worktree-session-stale-issue-id.md +0 -0
  270. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/025-green-stderr-noise-stall-detector.md +0 -0
  271. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/026-pi-spawn-lean-tool-schema.md +0 -0
  272. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/027-red-hang-timeout-rollback.md +0 -0
  273. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc/issues/028-task-scoped-judge-review-coverage.md +0 -0
  274. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/adhoc.jsonl +0 -0
  275. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/constitution.md +0 -0
  276. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/ast-tree-sitter.md +0 -0
  277. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/flow-ledger.md +0 -0
  278. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/graphite-cli.md +0 -0
  279. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/pi-agent-backend.md +0 -0
  280. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/product-layer.md +0 -0
  281. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/rpc-streaming-tui.md +0 -0
  282. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/rpc-streaming.md +0 -0
  283. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/explore/security-hardening-cwe.md +0 -0
  284. {deviatdd-2.21.2 → deviatdd-2.23.0}/specs/implementation-gap.md +0 -0
  285. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/__init__.py +0 -0
  286. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/__init__.py +0 -0
  287. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/_common.py +0 -0
  288. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/_html.py +0 -0
  289. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/_safe_commands.py +0 -0
  290. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/adhoc.py +0 -0
  291. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/constitution.py +0 -0
  292. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/feature.py +0 -0
  293. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/flow_commands.py +0 -0
  294. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/init.py +0 -0
  295. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/macro.py +0 -0
  296. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/review.py +0 -0
  297. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/cli/walkthrough.py +0 -0
  298. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/__init__.py +0 -0
  299. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/_shared.py +0 -0
  300. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/cache_discipline.py +0 -0
  301. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/commands.py +0 -0
  302. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/commit.py +0 -0
  303. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/complexity.py +0 -0
  304. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/constitution.py +0 -0
  305. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/contract.py +0 -0
  306. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/convention.py +0 -0
  307. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/epic.py +0 -0
  308. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/prd.py +0 -0
  309. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/profile.py +0 -0
  310. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/repo.py +0 -0
  311. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/run_logger.py +0 -0
  312. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/tasks_ledger.py +0 -0
  313. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/core/validation.py +0 -0
  314. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/html_templates/__init__.py +0 -0
  315. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/html_templates/architecture.html.tmpl +0 -0
  316. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/html_templates/domain-model.html.tmpl +0 -0
  317. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/html_templates/flows.html.tmpl +0 -0
  318. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/html_templates/plan.html.tmpl +0 -0
  319. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/html_templates/prd.html.tmpl +0 -0
  320. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/main.py +0 -0
  321. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/__init__.py +0 -0
  322. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/assembly.py +0 -0
  323. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/__init__.py +0 -0
  324. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/execute.md +0 -0
  325. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/explore.md +0 -0
  326. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/green.md +0 -0
  327. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/plan.md +0 -0
  328. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/prd.md +0 -0
  329. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/red.md +0 -0
  330. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/refactor.md +0 -0
  331. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/research.md +0 -0
  332. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/shard.md +0 -0
  333. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/specify.md +0 -0
  334. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/auto/tasks.md +0 -0
  335. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-adhoc.md +0 -0
  336. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-architecture.md +0 -0
  337. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-constitution.md +0 -0
  338. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-e2e.md +0 -0
  339. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-execute.md +0 -0
  340. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-explore.md +0 -0
  341. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-flows.md +0 -0
  342. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-green.md +0 -0
  343. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-hotfix.md +0 -0
  344. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-html.md +0 -0
  345. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-init.md +0 -0
  346. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-merge.md +0 -0
  347. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-plan.md +0 -0
  348. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-pr.md +0 -0
  349. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-prd.md +0 -0
  350. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-prune.md +0 -0
  351. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-red.md +0 -0
  352. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-refactor.md +0 -0
  353. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-release.md +0 -0
  354. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-research.md +0 -0
  355. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-review.md +0 -0
  356. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-shard.md +0 -0
  357. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-tasks.md +0 -0
  358. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-triage.md +0 -0
  359. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/commands/deviate-walkthrough.md +0 -0
  360. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/constitution_seed.md +0 -0
  361. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/core.md +0 -0
  362. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/lifecycle-auto.md +0 -0
  363. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/lifecycle-manual.md +0 -0
  364. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/macro-shared.md +0 -0
  365. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/meso-shared.md +0 -0
  366. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/micro-shared.md +0 -0
  367. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/product-shared.md +0 -0
  368. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/core/style-ste.md +0 -0
  369. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/governance/__init__.py +0 -0
  370. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/governance/agents_seed.md +0 -0
  371. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/governance/claudemd_seed.md +0 -0
  372. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/prompts/governance/libref_seed.md +0 -0
  373. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/state/__init__.py +0 -0
  374. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/ui/__init__.py +0 -0
  375. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/ui/monitor.py +0 -0
  376. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/ui/pipeline.py +0 -0
  377. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/ui/render.py +0 -0
  378. {deviatdd-2.21.2 → deviatdd-2.23.0}/src/deviate/visual/__init__.py +0 -0
  379. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/__init__.py +0 -0
  380. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/core/__init__.py +0 -0
  381. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/core/test_agent.py +0 -0
  382. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/core/test_smart_stall.py +0 -0
  383. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_derived_command_install.bats +0 -0
  384. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_green_stderr_stall.bats +0 -0
  385. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_macro_workflow.bats +0 -0
  386. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_optional_push_as_lock.bats +0 -0
  387. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_pi_spawn_lean_tool_schema.bats +0 -0
  388. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_red_hang_timeout_rollback.bats +0 -0
  389. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_review_plan_ac_coverage.bats +0 -0
  390. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/e2e/test_worktree_session_stale_issue.bats +0 -0
  391. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/__init__.py +0 -0
  392. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_adhoc.py +0 -0
  393. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_common.py +0 -0
  394. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_constitution.py +0 -0
  395. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_feature.py +0 -0
  396. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_flows_sync.py +0 -0
  397. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_help.py +0 -0
  398. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_html.py +0 -0
  399. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_init.py +0 -0
  400. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_macro_contracts.py +0 -0
  401. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_main_entrypoint.py +0 -0
  402. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_merge.py +0 -0
  403. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_meso.py +0 -0
  404. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_meso_contracts.py +0 -0
  405. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_real_descendant_kill.py +0 -0
  406. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_review.py +0 -0
  407. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_safe_commands.py +0 -0
  408. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_test_command_resolution.py +0 -0
  409. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_timeout_safe_command.py +0 -0
  410. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_cli/test_top_level_run.py +0 -0
  411. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_cache_discipline.py +0 -0
  412. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_commands.py +0 -0
  413. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_commit.py +0 -0
  414. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_complexity.py +0 -0
  415. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_constitution.py +0 -0
  416. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_contract.py +0 -0
  417. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_convention.py +0 -0
  418. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_epic.py +0 -0
  419. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_flow_confirmation.py +0 -0
  420. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_judge_evidence.py +0 -0
  421. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_ledger.py +0 -0
  422. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_prd.py +0 -0
  423. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_profile.py +0 -0
  424. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_repo.py +0 -0
  425. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_run_logger.py +0 -0
  426. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_tasks_ledger.py +0 -0
  427. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_core/test_validation.py +0 -0
  428. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_init.py +0 -0
  429. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/__init__.py +0 -0
  430. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/conftest.py +0 -0
  431. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_command_installation.py +0 -0
  432. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_init_export_cycle.py +0 -0
  433. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_macro_full_cycle.py +0 -0
  434. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_macro_layer.py +0 -0
  435. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_macro_orchestration.py +0 -0
  436. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_meso_layer.py +0 -0
  437. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_meso_orchestration.py +0 -0
  438. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_meso_task_ledger.py +0 -0
  439. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_parity.py +0 -0
  440. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_integration/test_skill_installation.py +0 -0
  441. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_macro/__init__.py +0 -0
  442. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_macro/test_explore.py +0 -0
  443. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_macro/test_macro_model_routing.py +0 -0
  444. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_macro/test_macro_orchestration.py +0 -0
  445. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_macro/test_prd.py +0 -0
  446. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_macro/test_research.py +0 -0
  447. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_macro/test_shard.py +0 -0
  448. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/__init__.py +0 -0
  449. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_auto_prompt_templates.py +0 -0
  450. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_meso_model_routing.py +0 -0
  451. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_meso_resume.py +0 -0
  452. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_plan_structure_injection.py +0 -0
  453. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_pr_platform.py +0 -0
  454. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_prompt_assembly.py +0 -0
  455. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_specify.py +0 -0
  456. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_meso/test_tasks.py +0 -0
  457. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/__init__.py +0 -0
  458. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/conftest.py +0 -0
  459. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_commit_failure.py +0 -0
  460. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_e2e.py +0 -0
  461. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_execute.py +0 -0
  462. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_green.py +0 -0
  463. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_hotfix.py +0 -0
  464. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_orchestration.py +0 -0
  465. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_output_filter.py +0 -0
  466. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_red.py +0 -0
  467. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_refactor.py +0 -0
  468. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_rollback_safety.py +0 -0
  469. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_run.py +0 -0
  470. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_task_label.py +0 -0
  471. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_micro/test_two_counter_retry.py +0 -0
  472. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_state/__init__.py +0 -0
  473. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_state/test_config.py +0 -0
  474. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_state/test_security_profile.py +0 -0
  475. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_state/test_session.py +0 -0
  476. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_ui/__init__.py +0 -0
  477. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_ui/test_monitor.py +0 -0
  478. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_ui/test_pipeline.py +0 -0
  479. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_ui/test_render.py +0 -0
  480. {deviatdd-2.21.2 → deviatdd-2.23.0}/tests/test_visual_demo/test_tsk_001_01.py +0 -0
@@ -0,0 +1,20 @@
1
+ # Preset config group: "default", "full", "fast", or "secure"
2
+ profile = "default"
3
+ # CLI inactivity timeout in seconds (must be > 0)
4
+ timeout_seconds = 1800
5
+ # Agent export mode: "local" (project) or "global" (~/.claude/)
6
+ agent_export_mode = "local"
7
+ # Enable the libref CLI for offline documentation lookups
8
+ use_libref = true
9
+ # Trunk branch for worktrees, PR base, and review diffs
10
+ base_branch = "main"
11
+ # Push the claim branch as a distributed lock (default true)
12
+ claim_remote = true
13
+
14
+ # Agent backend configuration
15
+
16
+ [agent]
17
+ backend = "pi"
18
+ timeout = 600
19
+ pi_rpc = false
20
+ transport = "rpc"
@@ -0,0 +1,86 @@
1
+ name: Release
2
+
3
+ on:
4
+ workflow_dispatch:
5
+ inputs:
6
+ bump:
7
+ description: SemVer bump (auto from conventional commits, or explicit)
8
+ required: false
9
+ default: auto
10
+ type: choice
11
+ options:
12
+ - auto
13
+ - patch
14
+ - minor
15
+ - major
16
+ dry_run:
17
+ description: Print the computed version and skip commit, tag, and publish
18
+ required: false
19
+ default: false
20
+ type: boolean
21
+
22
+ permissions:
23
+ contents: write
24
+ id-token: write
25
+
26
+ jobs:
27
+ release:
28
+ name: Cut and publish
29
+ runs-on: ubuntu-latest
30
+ steps:
31
+ - name: Refuse non-default branch unless dry_run
32
+ if: ${{ github.ref_name != github.event.repository.default_branch && inputs.dry_run != true }}
33
+ run: |
34
+ echo "Refusing to release from '${GITHUB_REF_NAME}'."
35
+ echo "Default branch is '${{ github.event.repository.default_branch }}'."
36
+ echo "Re-run with dry_run=true to preview, or run from the default branch."
37
+ exit 1
38
+
39
+ - uses: actions/checkout@v4
40
+ with:
41
+ fetch-depth: 0
42
+ ref: ${{ github.ref }}
43
+
44
+ - name: Install uv
45
+ uses: astral-sh/setup-uv@v6
46
+ with:
47
+ python-version: "3.13"
48
+
49
+ - name: Compute next version
50
+ id: version
51
+ run: |
52
+ set -euo pipefail
53
+ VERSION="$(uv run --no-project python scripts/next_version.py --bump "${{ inputs.bump }}")"
54
+ echo "version=${VERSION}" >> "${GITHUB_OUTPUT}"
55
+ echo "Computed next version: ${VERSION}"
56
+
57
+ - name: Dry run complete
58
+ if: ${{ inputs.dry_run == true }}
59
+ run: |
60
+ echo "dry_run=true — skipping commit, tag, and publish for ${{ steps.version.outputs.version }}"
61
+
62
+ - name: Apply version bump
63
+ if: ${{ inputs.dry_run != true }}
64
+ run: |
65
+ set -euo pipefail
66
+ uv run --no-project python scripts/next_version.py --bump "${{ inputs.bump }}" --write
67
+
68
+ - name: Commit, tag, and push
69
+ if: ${{ inputs.dry_run != true }}
70
+ run: |
71
+ set -euo pipefail
72
+ VERSION="${{ steps.version.outputs.version }}"
73
+ git config user.name "github-actions[bot]"
74
+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
75
+ git add pyproject.toml uv.lock
76
+ git commit -m "chore(release): version ${VERSION}"
77
+ git tag "v${VERSION}"
78
+ git push origin "HEAD:${GITHUB_REF_NAME}"
79
+ git push origin "v${VERSION}"
80
+
81
+ - name: Publish to PyPI
82
+ if: ${{ inputs.dry_run != true }}
83
+ run: |
84
+ set -euo pipefail
85
+ uv build
86
+ uv publish --trusted-publishing always
@@ -8,6 +8,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
8
8
  ## [Unreleased]
9
9
 
10
10
  ### Added
11
+ - **On-demand GitHub Actions Release workflow (`workflow_dispatch`).** A maintainer runs Actions → Release → Run workflow. The job computes the next SemVer from conventional commits since the current `pyproject.toml` version (`feat` → minor, `fix` → patch, `BREAKING CHANGE` / `feat!` / `fix!` → major; chore/docs/test/ci/style/refactor still bump patch), writes `pyproject.toml` + the `deviatdd` version in `uv.lock`, commits `chore(release): version X.Y.Z` on the default branch, tags `vX.Y.Z`, and publishes with `uv build` / `uv publish --trusted-publishing always` (PyPI trusted publishing via GitHub OIDC; `contents: write` + `id-token: write`; no `PYPI_API_TOKEN` and no GitHub secret). Optional inputs: `bump` (`auto` / `patch` / `minor` / `major`) and `dry_run` (print the version; skip commit/tag/publish). Refuses a non-default branch unless `dry_run` is true. Does not rewrite `CHANGELOG.md` (stays `[Unreleased]`). Operator adds a pending PyPI trusted publisher for `wernerbisschoff/deviatdd` workflow `release.yml` (no environment). Local fallback remains `mise run publish`. Pinned by `tests/test_release/test_next_version.py`.
12
+ - **COMPLETED `tasks.jsonl` rows now persist runner-validated JUDGE evidence (GH-84).** After the #65 mechanical gate accepts a TDD completion path (`skip_refactor` / bare `COMPLIANCE_PASS` / post-REFACTOR complete / adjudicated already-exists), `_append_status_transition(..., "COMPLETED")` copies `HandoverManifest.evidence` (`ac`, `test_path`, `test_quote`, `impl_path`, `impl_quote`) onto an optional `TaskRecord.evidence` bundle and stamps `red` (`session.red_commit_sha`) plus `green`/`head` (`HEAD` at the write). TDD complete fail-closes when the plan contract has `AC-PLAN-NNN` tokens and the bundle is missing or does not cover them (`evaluate_judge_evidence`, no new matcher). EXECUTE / IMMEDIATE / DIRECT stay ungated; enabling/infra plans with no AC tokens may complete with empty evidence. `deviate inspect tasks show` prints the field when present. Session files are not the proof store. Pinned by `tests/test_micro/test_completed_evidence.py`, `tests/test_state/test_ledger.py`, and `tests/test_cli/test_inspect.py`.
13
+ - **`deviate micro run --review` pauses before each phase commit (GH-101).** After the agent finishes a phase and tests/lint have run, `--review` (and `--all --review`) halt before `_commit_phase` / `_commit_phase_with_recovery` (`git add -A`), print `REVIEW_PAUSE <phase> <task_id>`, leave the worktree dirty for herdr/hunk, and wait for TTY confirmation (`Enter` / yes). Then the runner commits as today and continues. Pause applies to RED, GREEN, REFACTOR, and EXECUTE — not JUDGE feedback commits. RED is still committed before GREEN so `session.red_commit_sha` remains available for JUDGE `revert_to_red`. Non-TTY / `--json` / missing stdin fail closed with `REVIEW_REQUIRES_TTY` and never auto-commit past the flag. Off by default; no config key. The pause is one helper (`_maybe_review_pause`) in front of `_commit_phase`, not a copy in each phase. Pinned by `tests/test_micro/test_review_pause.py`.
14
+ - **`deviate judge post [<manifest>]` applies JUDGE revert + train feedback in manual mode (GH-104).** `/deviate-judge` already told the agent to run `deviate judge post` after the verdict, but only `judge pre` existed — manual mode printed the verdict and left GREEN (or RED+GREEN) in place. The new command reads the JUDGE handover (path or stdin YAML), coerces `next_action` with the same helpers auto uses (`_coerce_judge_action`, unmatched-PASS rewrite, GREEN TEST_FAILURE remap), then applies auto's side effects through `_apply_judge_verdict`: `revert_to_red` / `revert_before` reuse `_execute_rollback` / `_resolve_pre_red_sha`; train feedback is appended to the task card and committed by `_commit_judge_feedback_and_advance`; forward routes do not reset. Rejection without actionable feedback is `JUDGE_AGENT_NO_FEEDBACK`; a missing RED boundary on `revert_to_red` stays fatal. Auto `micro run` still calls `_run_judge_phase` and does not shell out to the new CLI. Overlay step 3 now names revert + `tasks.md` feedback + commit. Pinned by `tests/test_micro/test_judge.py::TestJudgePost`.
11
15
  - **`/deviate-pr` now marks the issue COMPLETED before it pushes, and opens a PR/MR only on request.** Rewritten to mirror `/deviate-merge`: `deviate pr run` appends the COMPLETED transition to `specs/issues.jsonl`, stages and commits it with the PR body, pushes the branch, then opens a GitHub PR (`gh pr create`) or a GitLab MR (`git push -o merge_request.create`). Platform is auto-detected from the `origin` remote hostname. `--no-pr` pushes and marks COMPLETED without opening anything; `--merge` / `--auto-merge` apply to GitHub only (GitLab warns and opens for review). `--platform github|gitlab` forces the platform. Pinned by `tests/test_integration/test_meso_layer.py::TestPrRun` and `tests/test_meso/test_pr_platform.py`.
12
16
  - **Graphite CLI integration is removed from the active code, prompts, and specs.** The `--graphite` setup flag, the `graphite` config field and `resolve_graphite_config`, the `gt create` / `gt submit` routing in `feature.py` / `micro.py` / `meso.py`, and the `## Graphite Stacked Changes Workflow` governance seed are gone. `deviate pr` no longer has a Graphite path (`git push -o merge_request.create` covers GitLab). Historical spec archives (`specs/adhoc/007-graphite-cli`, `specs/003-graphite-cli-integration`) and the append-only ledgers are left untouched.
13
17
  - **Manual slash-command bodies now derive from the canonical `auto/{phase}.md` core at install time.** `install_command`/`compose_command_body` (`src/deviate/core/commands.py`) splice the canonical `auto/{phase}.md` middle verbatim for the 11 overlapping phases (explore, research, prd, shard, plan, tasks, red, green, refactor, judge, execute) plus a per-phase manual overlay (pre/post-script lifecycle, rich handover manifest, `<context><user_input>`). The hand-maintained duplicate middle bodies were deleted from `commands/deviate-{phase}.md`, so the manual and auto modes can no longer drift. The derived RED inherits auto's `status: "PASS"` + `failure_kind` semantics (no `status: "FAIL"`/abort-on-passing-test); the derived GREEN inherits auto's "write ONLY production code" role language. A drift guard pins the identical-middle invariant across all 11 phases. Pinned by `tests/test_core/test_commands.py::TestManualDerivationFromAutoCore` and `tests/test_meso/test_auto_prompt_templates.py::TestManualDerivationDriftGuard`.
@@ -27,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
27
31
  - **`deviate html prd --bucket <slug>` targets a specific epic when more than one owns a `prd.md`.** Previously the command hard-failed with `HTML_AMBIGUOUS_PRD` whenever multiple numbered epics had a `prd.md` and offered no flag to disambiguate — the agent was told to "run from within the epic's worktree", which silently yielded `HTML_NO_PRD` because the resolver reads `specs/` from the repo root. The new option resolves `specs/<bucket>/prd.md` directly and bypasses ambiguity detection; the plain form keeps its existing behavior but its ambiguity banner now points at the flag. An unknown/absent bucket exits `PRD_NOT_FOUND`. The `/deviate-html` prompt (`src/deviate/prompts/commands/deviate-html.md`) and spec docs now reference `--bucket` instead of the broken cwd fallback. Pinned by `tests/test_cli/test_html.py::test_html_prd_bucket_targets_specific_epic`, `::test_html_prd_bucket_targets_unnumbered_dir`, and `::test_html_prd_bucket_missing_file_exits_cleanly`.
28
32
  - **Optional push-as-lock: `claim_remote` config plus `--local` on `meso run` and `run`.** Standing `.deviate/config.toml` key `claim_remote` defaults to `true` (absent file or absent key still push). `deviate setup --no-claim-remote` writes `claim_remote = false` without dropping `[models]`, `timeout_seconds`, or `[agent]`. Fresh setup without the flag writes `true`. Effective local mode is `--local` OR `claim_remote = false`; explicit `--local` always wins. Local mode still creates `.worktrees/feat/{epic}/{issue}/`, writes SPECIFIED, and commits the claim, and skips `branch_exists_on_remote` plus `git push`. `deviate specify --local` stays; omitted `--local` now honors config. `deviate meso run --local` and `deviate run --local` share that meaning. `--no-setup` remains a distinct skip of worktree plus claim. Local discovery does not treat an origin branch as claimed-elsewhere. Specs: `specs/DeviaTDD-api.md`, `specs/DeviaTDD-architecture.md` (Atomic Concurrency Protocol: push-as-lock is the default, not mandatory). Pinned by `tests/test_state/test_config.py`, `tests/test_cli/test_meso.py`, `tests/test_meso/test_specify.py`, `tests/test_meso/test_meso_orchestration.py`, `tests/test_cli/test_init.py`, and `tests/test_cli/test_top_level_run.py`.
29
33
  ### Changed
34
+ - **The `deviatdd` skill checks for an existing OPEN GitHub issue before filing a harness-bug issue.** The "Filing deviatdd issues" section now runs `gh issue list --repo wernerbisschoff/deviatdd --state open --search` first; when an open issue already matches the same harness failure, it directs commenting the new evidence/task context onto that issue (`gh issue comment`) instead of `gh issue create`, and only creates a new issue when no match exists. Prompt-only change to the packaged skill (`src/deviate/prompts/skills/deviatdd/SKILL.md`), re-installed to all agent skill dirs.
30
35
  - **`deviate refactor pre` now scopes `files_to_refactor` to the RED+GREEN production set (GH-98).** The command no longer glob()s every `src/**/*.py` or discards `_resolve_task_context`. It lists production files from `HEAD~2..HEAD`, falling back to the task `Files:` list minus tests when that git range is empty or unavailable. Test files are never included. The JSON contract now emits the documented handover fields (`status`, `task_id`, `task_title`, `task_type`, `test_command`, `lint_command`, `spec_dir`, `verification`, `repo_root`, `git_branch`, `timestamp`) alongside `files_to_refactor`. Auto `_build_auto_prompt("refactor")` injects the same scoped list and keeps the `git log -2` / `git diff HEAD~2..HEAD` inspect step. Pinned by `tests/test_micro/test_refactor.py`.
31
36
  - **GREEN / REFACTOR / review prompts fold smallest-change into existing lines** (reuse stdlib or an already-installed dep; in-place refactor; Opportunities do not extract helpers). Prompt-only. Pinned by `tests/test_meso/test_auto_prompt_templates.py::TestSmallestChangeFoldedIntoExistingPrompts`.
32
37
  - **JUDGE evidence is task-scoped; `deviate review` fail-closes on an unclaimed plan AC.** TDD `_run_judge_phase` resolves required `AC-PLAN-NNN` tokens via `resolve_task_ac_tokens` (non-empty `acceptance_criteria` `criterion_id`s, else this task's `tasks.md` card, else none) and does not fall back to every token in `plan.md`. ISS-ADH-020 exact-substring, path-in-diff, and uniqueness-floor checks still apply to that set. EXECUTE, IMMEDIATE, and DIRECT stay ungated. `deviate review pre` / `post` run a runner-owned Gate 3 scan (`evaluate_review_coverage`) and exit non-zero with `COVERAGE_INCOMPLETE` when any this-issue plan token has no COMPLETED claim. Missing `plan.md` or missing plan tokens stay vacuously READY. PENDING, FAILED, and sibling-issue rows do not claim. Pinned by `tests/test_core/test_judge_evidence.py`, `tests/test_micro/test_judge.py`, and `tests/test_cli/test_review.py`.
@@ -50,6 +55,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
50
55
  - **`/deviate-merge` no longer auto-pushes after the squash-merge commit; the push gate runs inline and the network push is opt-in.** The slash command previously ran `git push` as its final step. As of v2.4.0 the squash-merge commit lands on `main`, then a new `push_gate` step inlines the body of `.githooks/pre-push` (lint + format-check + testmon-driven affected tests with the warm-cache / full-suite fallback — bash 3.2 portable, `GIT_DIR` reset + trap preserved) so the safety net fires even though no `git push` happens yet. After the gate passes the skill asks the operator whether to `git push` (which fires the real `pre-push` hook and re-runs the same gate) or stop and push manually. The squash-merge commit and the ledger transition inside it are durable on `main` regardless of the push outcome — only the network push is deferred. New failure states: `Push_Gate_Failed` (inline gate non-zero), `Push_Failed` (`git push` non-zero, raw stderr surfaced), `Push_Deferred` (user chose "Stop — I'll push manually"). Inline gate body and `.githooks/pre-push` body must stay byte-equivalent; divergence is pinned by `tests/test_meso/test_auto_prompt_templates.py::TestMergePromptPushGate::test_hook_and_prompt_agree_on_gate_body` (which compares non-blank non-comment lines in both bodies and fails on drift in either direction) plus 3 supporting assertions on the upstream-first logic, the testmon fallback, and the prompt structure. Prompt: `src/deviate/prompts/commands/deviate-merge.md` (v2.3.0 → v2.4.0). Spec mirrors updated: `specs/DeviaTDD-architecture.md` (Merge bullet, new `**Push gate + opt-in push (v2.4.0)**` sub-bullet) and `specs/DeviaTDD-api.md` (new `**/deviate-merge push behavior (v2.4.0)**` entry under the `deviate merge` reference).
51
56
 
52
57
  ### Fixed
58
+ - **JUDGE prompt injection now uses the Judge-Feedback-stripped task card (GH-118).** `_build_auto_prompt("judge")` still reads the raw card via `_task_card_text`, then applies the same `_strip_judge_feedback` pass that `resolve_task_ac_tokens` already used for token resolution (#89). Prior-round `**Judge Feedback**` bullets and their continuation lines (including false ownership claims such as "AC-PLAN-003 belongs to a later task") no longer appear in `<task_card>`. Token resolution, `_append_judge_feedback`, and the COMPLETED evidence gate are unchanged. Specs: `specs/DeviaTDD-api.md`, `specs/DeviaTDD-architecture.md`. Pinned by `tests/test_micro/test_judge.py::TestJudgePromptStripsJudgeFeedback`.
59
+ - **Ledger appenders no longer concatenate a new JSONL record onto a last line that lacks a trailing newline (GH-117).** `_append_record` and `_append_with_compound_key` insert a leading `\n` when the file is non-empty and does not already end in a newline, so `_read_ledger` cannot skip a fused BACKLOG+SPECIFIED line. `claim_issue` now writes through `append_issue_transition` instead of a raw `"a"` append. Pinned by `tests/test_state/test_ledger.py` and `tests/test_core/test_issues.py`.
60
+ - **JUDGE handover parse now recovers unescaped `"` inside evidence quote fields (GH-116).** `AgentBackend.parse_output` retries `yaml.safe_load` after rewriting broken `quote` / `test_quote` / `impl_quote` double-quoted scalars as `|` block scalars, so citations such as `assert "YAGNI" in text` and `== ["AC-PLAN-002"]` no longer raise `MalformedHandoverManifestError`. Well-formed YAML is unchanged. The auto judge prompt also prefers `|` block scalars when a quote contains `"`. Pinned by `tests/test_core/test_agent.py`.
61
+ - **A `no_failing_test` already-exists JUDGE `COMPLIANCE_PASS` now completes via `skip_refactor` instead of hard-crashing with `ROLLBACK_BOUNDARY_MISSING`.** On the RED `no_failing_test` adjudication route (`session.failure_kind == "no_failing_test"`, `session.red_commit_sha == ""`), `_apply_judge_verdict` coerces any PASS `next_action` to `skip_refactor` through `_NO_FAILING_TEST_FORWARD_ROUTES`, skips the unmatched-PASS AC-token citation rewrite, and relaxes only the `COMPLETED_EVIDENCE_MISSING` token check for that route — the declared-regression-files gate (`_require_tdd_declared_regression_files`) stays fail-closed, a wrong test still routes to `revert_before` for RED re-author, and a genuine test-bearing RED with a real RED commit still rolls back via `revert_to_red`. Previously every retry crashed because the mechanical gate rewrote the pass to `revert_to_red` with no RED commit to roll back to. Specs updated: `specs/DeviaTDD-api.md`, `specs/DeviaTDD-architecture.md`. Pinned by `tests/test_micro/test_judge.py` and `tests/test_cli/test_micro.py`.
62
+ - **Feature worktrees now base on the local trunk, so locally-authored (unpushed) issues plan without failing.** `resolve_start_point` (`src/deviate/core/worktree.py`) previously preferred `origin/<base>` over local `<base>`, so a `deviate meso run` that discovered an issue committed only to local `main` created its worktree from a stale `origin/main` that lacked the issue's `specs/issues.jsonl` row and source file — the plan agent wrote `plan.md`, then `deviate plan post` failed with `ISSUE_NOT_FOUND <IDS>` and exited 1. Meso reads the issue ledger from the local trunk, so the worktree base now comes from local `<base>` first (falling back to `origin/<base>`, then `HEAD`). Pinned by `tests/test_core/test_worktree.py::TestCreateWorktree::test_resolve_start_point_prefers_local_base_over_stale_origin`.
63
+ - **`deviate meso run` / `deviate specify` auto-discovery now skips issues already claimed locally.** A claim writes the issue's `BACKLOG → SPECIFIED` ledger row in the new worktree and commits it on the `feat/{epic}/{issue}` feature branch, so the main checkout's `specs/issues.jsonl` still shows the issue as `BACKLOG`. `_discover_claimable_issue` therefore re-returned the same first issue to a second terminal on the same checkout (parallel run) instead of claiming a different one; the origin-branch lock only caught issues whose claim branch had been `git push`-ed. Discovery now also skips a candidate whose `feat/{epic}/{issue}` branch already has a local worktree (treated as claimed here), in both local and default mode, mirroring the signal `_try_claim_issue` already uses for `ALREADY_CLAIMED_LOCAL`. Two terminals on one checkout can now claim two different BACKLOG issues in parallel. Pinned by `tests/test_meso/test_meso_orchestration.py::TestDiscoverClaimableIssue::test_skips_issues_with_local_worktree`.
64
+ - **`_append_judge_feedback` writes under the rejected task card, and the evidence gate keeps judge `train_feedback` / `violations` (GH-102).** The appender locates the card with `_TASK_BULLET_HEAD_RE` exact-id match (same regex as `_read_judge_feedback_from_tasks_md`) and stops at the next task or a `##` / `###` phase heading, so a Phase 1 `TSK-004-01` rejection no longer drops `**Judge Feedback**` under the next phase `### Tasks` / `TSK-004-02`. When the evidence gate rewrites unmatched PASS, persist the judge's own `train_feedback` / `violations` (after the GH-103 citation strip) instead of replacing them with the generic `JUDGE evidence is missing...` string. Pinned by `tests/test_micro/test_judge.py::TestJudgeFeedbackLogging::test_append_judge_feedback_stays_under_rejected_card_across_phase_header` and `TestTddJudgeEvidenceGate::test_rewritten_pass_keeps_judge_train_feedback` / `::test_rewritten_pass_keeps_judge_violations`.
65
+ - **JUDGE injected diff walks past docs-feedback `red_commit_sha` to the real RED commit (GH-88, GH-90).** `_maybe_advance_red_sha_past_feedback` still advances the session SHA onto `docs(...): add judge feedback for retry` so GREEN entry and `revert_to_red` keep a valid TRAIN boundary. `_assemble_judge_injected_diff` now resolves the diff base via `_resolve_judge_diff_base`, walking back through those feedback subjects to the RED-phase failing-test commit and running `git diff {red_sha}^..HEAD`. The evidence gate no longer false-rejects with `test_path is not in the injected diff` or missing AC tokens solely because the RED test dropped out of a docs-only range. Pinned by `tests/test_micro/test_judge.py::TestJudgeDiffBaseWalksPastFeedback`.
53
66
  - **`resolve_task_ac_tokens` no longer treats runner-appended `**Judge Feedback**` as required AC tokens (GH-89).** Card-text fallback still follows first-hit order (`acceptance_criteria` `criterion_id`s, else the task card, else none) but now drops `**Judge Feedback**` bullets and their continuation lines before scanning for `AC-PLAN-NNN`. A feedback line quoting `AC-PLAN-001` does not add that token when the card body does not name it. `_task_card_text` still returns the full card. Pinned by `tests/test_core/test_judge_evidence.py::TestResolveTaskAcTokens::test_judge_feedback_quote_does_not_add_token`.
54
67
  - **JUDGE revert-route `train_feedback` no longer persists discarded `file:line` citations (GH-103).** After `revert_before` / `revert_to_red`, `_judge_feedback_from_manifest` strips `path:line` tokens before writing `session.train_feedback` and `tasks.md`. The durable rewrite contract ("The next RED/GREEN attempt must: …") stays. Rollback SHA selection is unchanged. Auto judge prompt also forbids line citations on those routes. Pinned by `tests/test_micro/test_judge.py::TestRevertFeedbackStripsLineCitations`.
55
68
  - **`deviate micro run` now honors `[agent].timeout` from the worktree `.deviate/config.toml` (GH-87).** `_invoke_agent` previously constructed `AgentConfig(backend=...)` with the 600s default, so long GREEN runs died with `AGENT_TIMEOUT` even when the operator set `timeout = 1800`. Meso already read the same key. Unset or invalid values still default to 600. Pinned by `tests/test_cli/test_micro.py::TestInvokeAgentConfigTimeout`.
@@ -258,10 +258,34 @@ do require the same traceability.
258
258
 
259
259
  ## Release process (for maintainers)
260
260
 
261
- 1. Update `CHANGELOG.md` — move `[Unreleased]` bullets into a dated
262
- `[X.Y.Z]` section.
263
- 2. Bump `version` in `pyproject.toml`.
264
- 3. `git tag -s vX.Y.Z -m "Release vX.Y.Z"` (signed tag).
265
- 4. `git push origin main --follow-tags`.
266
- 5. CI publishes to PyPI via trusted publishing once the workflow is
267
- enabled.
261
+ Leave `CHANGELOG.md` under `## [Unreleased]`. The Release workflow does
262
+ not rewrite the changelog (tests pin bullets there).
263
+
264
+ 1. On PyPI, add a **pending trusted publisher** for project `deviatdd`
265
+ ([Publishing → Trusted publishers](https://pypi.org/manage/account/publishing/)):
266
+ - Owner / org: `wernerbisschoff`
267
+ - Repository: `deviatdd`
268
+ - Workflow: `release.yml`
269
+ - Environment: leave empty (this workflow does not use a GitHub
270
+ Environment)
271
+ The first successful `uv publish` from that workflow promotes the
272
+ pending publisher. No GitHub secret is required.
273
+ 2. On GitHub, open **Actions → Release → Run workflow** on the default
274
+ branch (`main`).
275
+ - `bump`: `auto` (default) computes the next SemVer from conventional
276
+ commits since the commit that set the current `pyproject.toml`
277
+ version (`feat` → minor, `fix` → patch, `BREAKING CHANGE` /
278
+ `feat!` / `fix!` → major). Only `chore` / `docs` / `test` / `ci` /
279
+ `style` / `refactor` still bumps patch so a manual cut always
280
+ produces a new version. Choose `patch` / `minor` / `major` to
281
+ force a level.
282
+ - `dry_run`: print the computed version and skip commit, tag, and
283
+ publish. Dry-run is allowed from a non-default branch; a real cut
284
+ is not.
285
+ 3. The job writes `version = "X.Y.Z"` in `pyproject.toml` and the
286
+ matching `name = "deviatdd"` version in `uv.lock`, commits
287
+ `chore(release): version X.Y.Z` on the ref the workflow ran on,
288
+ tags `vX.Y.Z`, pushes commit + tag, then runs `uv build` and
289
+ `uv publish --trusted-publishing always` (GitHub OIDC; no token).
290
+ 4. Local fallback (no bump, no tag): `mise run publish` still builds
291
+ and uploads using `PYPI_API_TOKEN` from `.env`.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: deviatdd
3
- Version: 2.21.2
3
+ Version: 2.23.0
4
4
  Summary: DeviaTDD CLI — agent orchestration framework
5
5
  Project-URL: Homepage, https://github.com/wernerbisschoff/deviatdd
6
6
  Project-URL: Repository, https://github.com/wernerbisschoff/deviatdd
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "deviatdd"
3
- version = "2.21.2"
3
+ version = "2.23.0"
4
4
  description = "DeviaTDD CLI — agent orchestration framework"
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -0,0 +1,262 @@
1
+ #!/usr/bin/env python3
2
+ """Compute the next SemVer for an on-demand GitHub Actions release cut.
3
+
4
+ Reads the current ``version`` from ``pyproject.toml``, inspects conventional
5
+ commits since the commit that set that version (falling back to the latest
6
+ ``v*`` tag, then the previous ``chore(release):`` commit), and prints the
7
+ next ``X.Y.Z`` on stdout.
8
+
9
+ Bump rules (highest wins):
10
+
11
+ - ``BREAKING CHANGE`` / ``feat!:`` / ``fix!:`` → major
12
+ - ``feat:`` → minor
13
+ - ``fix:`` → patch
14
+ - only ``chore`` / ``docs`` / ``test`` / ``ci`` / ``style`` / ``refactor``
15
+ → patch (a manual cut still produces a new version)
16
+ - no conventional commits since the baseline → patch
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import argparse
22
+ import os
23
+ import re
24
+ import subprocess
25
+ import sys
26
+ from pathlib import Path
27
+
28
+ _TYPES = ("feat", "fix", "chore", "docs", "test", "ci", "style", "refactor")
29
+ _SUBJECT_RE = re.compile(
30
+ rf"^(?:(?P<type>{'|'.join(_TYPES)})"
31
+ rf"(?P<scope>\([^)]*\))?(?P<breaking>!)?:"
32
+ rf")\s",
33
+ re.IGNORECASE,
34
+ )
35
+ _BREAKING_RE = re.compile(r"BREAKING[ -]CHANGE", re.IGNORECASE)
36
+ _PYPROJECT_VERSION_RE = re.compile(
37
+ r'^version\s*=\s*["\']([^"\']+)["\']\s*$',
38
+ re.MULTILINE,
39
+ )
40
+ _LOCK_VERSION_RE = re.compile(
41
+ r'(name = "deviatdd"\nversion = ")[^"]+(")',
42
+ )
43
+ _RELEASE_SUBJECT_RE = r"^chore\(release\): version "
44
+ _RANK = {"major": 3, "minor": 2, "patch": 1}
45
+
46
+
47
+ def git_env() -> dict[str, str]:
48
+ """Strip GIT_*/GH_* so subprocess git never inherits a parent repo."""
49
+ return {
50
+ k: v
51
+ for k, v in os.environ.items()
52
+ if not k.startswith("GIT_") and not k.startswith("GH_")
53
+ }
54
+
55
+
56
+ def _git(*args: str, repo: Path) -> subprocess.CompletedProcess[str]:
57
+ return subprocess.run(
58
+ ["git", *args],
59
+ cwd=repo,
60
+ env=git_env(),
61
+ check=True,
62
+ capture_output=True,
63
+ text=True,
64
+ )
65
+
66
+
67
+ def read_current_version(pyproject: Path) -> str:
68
+ text = pyproject.read_text(encoding="utf-8")
69
+ match = _PYPROJECT_VERSION_RE.search(text)
70
+ if match is None:
71
+ raise SystemExit(f"version not found in {pyproject}")
72
+ return match.group(1)
73
+
74
+
75
+ def bump_semver(version: str, level: str) -> str:
76
+ try:
77
+ major_s, minor_s, patch_s = version.split(".")
78
+ major, minor, patch = int(major_s), int(minor_s), int(patch_s)
79
+ except ValueError as exc:
80
+ raise SystemExit(f"not a X.Y.Z version: {version!r}") from exc
81
+ if level == "major":
82
+ return f"{major + 1}.0.0"
83
+ if level == "minor":
84
+ return f"{major}.{minor + 1}.0"
85
+ if level == "patch":
86
+ return f"{major}.{minor}.{patch + 1}"
87
+ raise SystemExit(f"unknown bump level: {level!r}")
88
+
89
+
90
+ def classify_commit(message: str) -> str | None:
91
+ if _BREAKING_RE.search(message):
92
+ return "major"
93
+ subject = message.split("\n", 1)[0].strip()
94
+ match = _SUBJECT_RE.match(subject)
95
+ if match is None:
96
+ return None
97
+ if match.group("breaking"):
98
+ return "major"
99
+ commit_type = match.group("type").lower()
100
+ if commit_type == "feat":
101
+ return "minor"
102
+ if commit_type == "fix":
103
+ return "patch"
104
+ if commit_type in {"chore", "docs", "test", "ci", "style", "refactor"}:
105
+ return "patch"
106
+ return None
107
+
108
+
109
+ def highest_bump(messages: list[str]) -> str:
110
+ rank = 0
111
+ for message in messages:
112
+ level = classify_commit(message)
113
+ if level is None:
114
+ continue
115
+ rank = max(rank, _RANK[level])
116
+ if rank == 0:
117
+ return "patch"
118
+ for name, value in _RANK.items():
119
+ if value == rank:
120
+ return name
121
+ return "patch"
122
+
123
+
124
+ def _pickaxe_version_commit(repo: Path, version: str) -> str | None:
125
+ needle = f'version = "{version}"'
126
+ result = subprocess.run(
127
+ ["git", "log", "-1", "--format=%H", "-S", needle, "--", "pyproject.toml"],
128
+ cwd=repo,
129
+ env=git_env(),
130
+ capture_output=True,
131
+ text=True,
132
+ check=False,
133
+ )
134
+ sha = result.stdout.strip()
135
+ return sha or None
136
+
137
+
138
+ def _latest_v_tag(repo: Path) -> str | None:
139
+ result = subprocess.run(
140
+ ["git", "tag", "-l", "v*", "--sort=-v:refname"],
141
+ cwd=repo,
142
+ env=git_env(),
143
+ capture_output=True,
144
+ text=True,
145
+ check=False,
146
+ )
147
+ for line in result.stdout.splitlines():
148
+ tag = line.strip()
149
+ if tag:
150
+ return tag
151
+ return None
152
+
153
+
154
+ def _latest_release_commit(repo: Path) -> str | None:
155
+ result = subprocess.run(
156
+ [
157
+ "git",
158
+ "log",
159
+ "-1",
160
+ "--extended-regexp",
161
+ f"--grep={_RELEASE_SUBJECT_RE}",
162
+ "--format=%H",
163
+ ],
164
+ cwd=repo,
165
+ env=git_env(),
166
+ capture_output=True,
167
+ text=True,
168
+ check=False,
169
+ )
170
+ sha = result.stdout.strip()
171
+ return sha or None
172
+
173
+
174
+ def find_version_baseline(repo: Path, current_version: str) -> str:
175
+ for candidate in (
176
+ _pickaxe_version_commit(repo, current_version),
177
+ _latest_v_tag(repo),
178
+ _latest_release_commit(repo),
179
+ ):
180
+ if candidate:
181
+ return candidate
182
+ raise SystemExit(
183
+ "could not determine version baseline "
184
+ "(no pyproject version commit, v* tag, or chore(release) commit)"
185
+ )
186
+
187
+
188
+ def commits_since(repo: Path, baseline: str) -> list[str]:
189
+ result = _git("log", f"{baseline}..HEAD", "--format=%B%x1e", repo=repo)
190
+ return [block.strip() for block in result.stdout.split("\x1e") if block.strip()]
191
+
192
+
193
+ def compute_next_version(repo: Path, bump: str = "auto") -> str:
194
+ pyproject = repo / "pyproject.toml"
195
+ current = read_current_version(pyproject)
196
+ if bump != "auto":
197
+ return bump_semver(current, bump)
198
+ baseline = find_version_baseline(repo, current)
199
+ level = highest_bump(commits_since(repo, baseline))
200
+ return bump_semver(current, level)
201
+
202
+
203
+ def persist_version(repo: Path, version: str) -> None:
204
+ pyproject = repo / "pyproject.toml"
205
+ text = pyproject.read_text(encoding="utf-8")
206
+ updated, count = _PYPROJECT_VERSION_RE.subn(f'version = "{version}"', text, count=1)
207
+ if count != 1:
208
+ raise SystemExit(f"failed to write version in {pyproject}")
209
+ pyproject.write_text(updated, encoding="utf-8")
210
+
211
+ lock = repo / "uv.lock"
212
+ if not lock.is_file():
213
+ raise SystemExit(f"uv.lock not found at {lock}")
214
+ lock_text = lock.read_text(encoding="utf-8")
215
+ lock_updated, lock_count = _LOCK_VERSION_RE.subn(
216
+ rf"\g<1>{version}\2", lock_text, count=1
217
+ )
218
+ if lock_count != 1:
219
+ raise SystemExit(f'failed to write name = "deviatdd" version in {lock}')
220
+ lock.write_text(lock_updated, encoding="utf-8")
221
+
222
+
223
+ def main(argv: list[str] | None = None) -> int:
224
+ parser = argparse.ArgumentParser(description=__doc__)
225
+ parser.add_argument(
226
+ "--repo",
227
+ type=Path,
228
+ default=Path.cwd(),
229
+ help="repository root (default: cwd)",
230
+ )
231
+ parser.add_argument(
232
+ "--bump",
233
+ choices=("auto", "patch", "minor", "major"),
234
+ default="auto",
235
+ help="bump level (default: auto from conventional commits)",
236
+ )
237
+ parser.add_argument(
238
+ "--write",
239
+ action="store_true",
240
+ help="persist the computed version to pyproject.toml and uv.lock",
241
+ )
242
+ parser.add_argument(
243
+ "--dry-run",
244
+ action="store_true",
245
+ help="print the computed version and skip all writes",
246
+ )
247
+ args = parser.parse_args(argv)
248
+
249
+ repo = args.repo.resolve()
250
+ version = compute_next_version(repo, bump=args.bump)
251
+ print(version)
252
+ if args.dry_run:
253
+ print(f"dry_run: next version is {version} (no files written)", file=sys.stderr)
254
+ return 0
255
+ if args.write:
256
+ persist_version(repo, version)
257
+ print(f"wrote {version} to pyproject.toml and uv.lock", file=sys.stderr)
258
+ return 0
259
+
260
+
261
+ if __name__ == "__main__":
262
+ raise SystemExit(main())