pactkit 2.10.4__tar.gz → 2.10.5__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 (554) hide show
  1. {pactkit-2.10.4 → pactkit-2.10.5}/.github/workflows/pactkit.yml +1 -1
  2. {pactkit-2.10.4 → pactkit-2.10.5}/CHANGELOG.md +8 -0
  3. {pactkit-2.10.4 → pactkit-2.10.5}/PKG-INFO +1 -1
  4. {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/archive/lessons_archive_202603.md +1 -0
  5. {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/lessons.md +1 -1
  6. {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/rules.md +1 -1
  7. {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/archive/archive_202604.md +15 -0
  8. {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/context.md +2 -2
  9. pactkit-2.10.5/docs/specs/STORY-slim-101.md +155 -0
  10. pactkit-2.10.5/docs/specs/STORY-slim-102.md +135 -0
  11. {pactkit-2.10.4 → pactkit-2.10.5}/pyproject.toml +1 -1
  12. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/__init__.py +1 -1
  13. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/cli.py +5 -9
  14. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/config.py +5 -9
  15. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/deployer.py +4 -0
  16. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/guards.py +18 -14
  17. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/commands.py +6 -0
  18. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/rules.py +132 -3
  19. {pactkit-2.10.4 → pactkit-2.10.5}/tests/e2e/cli/test_cli_e2e.py +13 -15
  20. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug013_config_single_source.py +2 -1
  21. pactkit-2.10.5/tests/unit/test_bug026_version_sync.py +186 -0
  22. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_config.py +8 -6
  23. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_config_auto_merge.py +3 -5
  24. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_deployer_cleanup.py +10 -5
  25. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompt_structural_invariants.py +2 -2
  26. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_release_v110.py +3 -3
  27. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_selective_deploy.py +2 -1
  28. pactkit-2.10.5/tests/unit/test_solution_design_rule.py +137 -0
  29. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story014_release.py +3 -6
  30. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story033_config_backfill.py +3 -3
  31. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story063_prompt_slimming.py +2 -1
  32. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim010_dry_refactor.py +4 -5
  33. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim011_command_rules.py +2 -2
  34. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim021.py +2 -2
  35. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim023.py +25 -8
  36. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim026.py +2 -2
  37. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim077_monorepo_stack.py +4 -3
  38. pactkit-2.10.5/tests/unit/test_story_slim102_version_marker.py +146 -0
  39. pactkit-2.10.4/tests/unit/test_bug026_version_sync.py +0 -153
  40. {pactkit-2.10.4 → pactkit-2.10.5}/.github/workflows/publish.yml +0 -0
  41. {pactkit-2.10.4 → pactkit-2.10.5}/.gitignore +0 -0
  42. {pactkit-2.10.4 → pactkit-2.10.5}/.opencode/pactkit.yaml +0 -0
  43. {pactkit-2.10.4 → pactkit-2.10.5}/AGENTS.md +0 -0
  44. {pactkit-2.10.4 → pactkit-2.10.5}/CODE_OF_CONDUCT.md +0 -0
  45. {pactkit-2.10.4 → pactkit-2.10.5}/CONTRIBUTING.md +0 -0
  46. {pactkit-2.10.4 → pactkit-2.10.5}/LICENSE +0 -0
  47. {pactkit-2.10.4 → pactkit-2.10.5}/README.md +0 -0
  48. {pactkit-2.10.4 → pactkit-2.10.5}/SECURITY.md +0 -0
  49. {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  50. {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/harness_audit.json +0 -0
  51. {pactkit-2.10.4 → pactkit-2.10.5}/docs/architecture/governance/philosophy.md +0 -0
  52. {pactkit-2.10.4 → pactkit-2.10.5}/docs/assets/logo.png +0 -0
  53. {pactkit-2.10.4 → pactkit-2.10.5}/docs/guides/codex-integration-preresearch.md +0 -0
  54. {pactkit-2.10.4 → pactkit-2.10.5}/docs/guides/tool-integration-checklist.md +0 -0
  55. {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/archive/archive_202602.md +0 -0
  56. {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/archive/archive_202603.md +0 -0
  57. {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/friction-log.md +0 -0
  58. {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/prd.md +0 -0
  59. {pactkit-2.10.4 → pactkit-2.10.5}/docs/product/sprint_board.md +0 -0
  60. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-001.md +0 -0
  61. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-002.md +0 -0
  62. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-003.md +0 -0
  63. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-004.md +0 -0
  64. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-005.md +0 -0
  65. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-006.md +0 -0
  66. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-007.md +0 -0
  67. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-008.md +0 -0
  68. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-009.md +0 -0
  69. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-010.md +0 -0
  70. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-011.md +0 -0
  71. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-012.md +0 -0
  72. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-013.md +0 -0
  73. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-014.md +0 -0
  74. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-015.md +0 -0
  75. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-016.md +0 -0
  76. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-017.md +0 -0
  77. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-018.md +0 -0
  78. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-019.md +0 -0
  79. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-020.md +0 -0
  80. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-021.md +0 -0
  81. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-022.md +0 -0
  82. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-023.md +0 -0
  83. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-024.md +0 -0
  84. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-025.md +0 -0
  85. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-026.md +0 -0
  86. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-027.md +0 -0
  87. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-028.md +0 -0
  88. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-029.md +0 -0
  89. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-030.md +0 -0
  90. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-031.md +0 -0
  91. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-032.md +0 -0
  92. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-033.md +0 -0
  93. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-034.md +0 -0
  94. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-035.md +0 -0
  95. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-001.md +0 -0
  96. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-002.md +0 -0
  97. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-003.md +0 -0
  98. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-004.md +0 -0
  99. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-005.md +0 -0
  100. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-006.md +0 -0
  101. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/BUG-slim-089.md +0 -0
  102. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-023.md +0 -0
  103. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-049.md +0 -0
  104. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-050.md +0 -0
  105. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-051.md +0 -0
  106. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-052.md +0 -0
  107. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-061.md +0 -0
  108. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-062.md +0 -0
  109. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-067.md +0 -0
  110. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-069.md +0 -0
  111. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-070.md +0 -0
  112. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-085.md +0 -0
  113. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-087.md +0 -0
  114. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-096.md +0 -0
  115. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/HOTFIX-slim-099.md +0 -0
  116. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-001.md +0 -0
  117. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-002.md +0 -0
  118. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-003.md +0 -0
  119. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-004.md +0 -0
  120. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-005.md +0 -0
  121. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-006.md +0 -0
  122. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-007.md +0 -0
  123. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-008.md +0 -0
  124. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-009.md +0 -0
  125. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-010.md +0 -0
  126. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-011.md +0 -0
  127. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-012.md +0 -0
  128. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-013.md +0 -0
  129. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-014.md +0 -0
  130. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-015.md +0 -0
  131. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-016.md +0 -0
  132. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-017.md +0 -0
  133. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-018.md +0 -0
  134. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-019.md +0 -0
  135. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-020.md +0 -0
  136. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-021.md +0 -0
  137. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-022.md +0 -0
  138. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-023.md +0 -0
  139. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-024.md +0 -0
  140. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-025.md +0 -0
  141. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-026.md +0 -0
  142. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-027.md +0 -0
  143. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-028.md +0 -0
  144. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-029.md +0 -0
  145. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-030.md +0 -0
  146. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-031.md +0 -0
  147. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-032.md +0 -0
  148. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-033.md +0 -0
  149. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-034.md +0 -0
  150. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-035.md +0 -0
  151. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-036.md +0 -0
  152. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-037.md +0 -0
  153. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-038.md +0 -0
  154. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-039.md +0 -0
  155. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-040.md +0 -0
  156. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-041.md +0 -0
  157. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-042.md +0 -0
  158. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-043.md +0 -0
  159. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-044.md +0 -0
  160. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-045.md +0 -0
  161. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-046.md +0 -0
  162. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-047.md +0 -0
  163. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-048.md +0 -0
  164. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-049.md +0 -0
  165. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-050.md +0 -0
  166. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-051.md +0 -0
  167. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-052.md +0 -0
  168. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-053.md +0 -0
  169. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-054.md +0 -0
  170. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-055.md +0 -0
  171. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-056.md +0 -0
  172. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-057.md +0 -0
  173. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-058.md +0 -0
  174. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-059.md +0 -0
  175. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-060.md +0 -0
  176. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-061.md +0 -0
  177. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-062.md +0 -0
  178. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-063.md +0 -0
  179. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-064.md +0 -0
  180. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-065.md +0 -0
  181. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-069.md +0 -0
  182. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-070.md +0 -0
  183. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-071.md +0 -0
  184. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-072.md +0 -0
  185. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-073.md +0 -0
  186. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-001.md +0 -0
  187. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-005.md +0 -0
  188. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-006.md +0 -0
  189. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-007.md +0 -0
  190. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-009.md +0 -0
  191. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-010.md +0 -0
  192. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-011.md +0 -0
  193. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-012.md +0 -0
  194. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-013.md +0 -0
  195. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-014.md +0 -0
  196. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-015.md +0 -0
  197. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-016.md +0 -0
  198. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-017.md +0 -0
  199. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-018.md +0 -0
  200. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-019.md +0 -0
  201. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-020.md +0 -0
  202. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-021.md +0 -0
  203. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-022.md +0 -0
  204. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-023.md +0 -0
  205. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-024.md +0 -0
  206. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-028.md +0 -0
  207. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-029.md +0 -0
  208. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-030.md +0 -0
  209. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-031.md +0 -0
  210. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-032.md +0 -0
  211. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-033.md +0 -0
  212. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-034.md +0 -0
  213. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-035.md +0 -0
  214. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-036.md +0 -0
  215. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-037.md +0 -0
  216. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-038.md +0 -0
  217. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-039.md +0 -0
  218. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-040.md +0 -0
  219. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-041.md +0 -0
  220. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-042.md +0 -0
  221. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-043.md +0 -0
  222. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-044.md +0 -0
  223. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-045.md +0 -0
  224. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-046.md +0 -0
  225. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-047.md +0 -0
  226. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-048.md +0 -0
  227. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-049.md +0 -0
  228. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-050.md +0 -0
  229. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-051.md +0 -0
  230. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-052.md +0 -0
  231. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-053.md +0 -0
  232. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-054.md +0 -0
  233. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-055.md +0 -0
  234. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-056.md +0 -0
  235. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-057.md +0 -0
  236. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-058.md +0 -0
  237. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-059.md +0 -0
  238. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-060.md +0 -0
  239. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-063.md +0 -0
  240. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-066.md +0 -0
  241. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-067.md +0 -0
  242. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-068.md +0 -0
  243. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-069.md +0 -0
  244. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-070.md +0 -0
  245. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-071.md +0 -0
  246. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-072.md +0 -0
  247. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-073.md +0 -0
  248. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-074.md +0 -0
  249. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-075.md +0 -0
  250. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-076.md +0 -0
  251. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-077.md +0 -0
  252. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-078.md +0 -0
  253. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-079.md +0 -0
  254. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-080.md +0 -0
  255. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-081.md +0 -0
  256. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-082.md +0 -0
  257. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-083.md +0 -0
  258. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-084.md +0 -0
  259. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-086.md +0 -0
  260. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-088.md +0 -0
  261. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-089.md +0 -0
  262. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-090.md +0 -0
  263. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-091.md +0 -0
  264. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-092.md +0 -0
  265. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-093.md +0 -0
  266. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-094.md +0 -0
  267. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-095.md +0 -0
  268. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-097.md +0 -0
  269. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-098.md +0 -0
  270. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-099.md +0 -0
  271. {pactkit-2.10.4 → pactkit-2.10.5}/docs/specs/STORY-slim-100.md +0 -0
  272. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/BUG-001_case.md +0 -0
  273. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/BUG-002_case.md +0 -0
  274. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-028_case.md +0 -0
  275. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-029_case.md +0 -0
  276. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-031_case.md +0 -0
  277. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-032_case.md +0 -0
  278. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-033_case.md +0 -0
  279. {pactkit-2.10.4 → pactkit-2.10.5}/docs/test_cases/STORY-slim-034_case.md +0 -0
  280. {pactkit-2.10.4 → pactkit-2.10.5}/opencode.json +0 -0
  281. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/__main__.py +0 -0
  282. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/audit.py +0 -0
  283. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/backfill.py +0 -0
  284. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/cleaners.py +0 -0
  285. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/context_gen.py +0 -0
  286. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/coverage_gate.py +0 -0
  287. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/doctor.py +0 -0
  288. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/garden.py +0 -0
  289. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/__init__.py +0 -0
  290. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/adapter.py +0 -0
  291. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/generators/deploy_base.py +0 -0
  292. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/id_generator.py +0 -0
  293. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/invariants.py +0 -0
  294. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/issue_sync.py +0 -0
  295. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/lazy_visualize.py +0 -0
  296. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/lessons.py +0 -0
  297. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/lint_runner.py +0 -0
  298. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/observe.py +0 -0
  299. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/profiles.py +0 -0
  300. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/__init__.py +0 -0
  301. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/agents.py +0 -0
  302. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/references.py +0 -0
  303. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/skills.py +0 -0
  304. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/prompts/workflows.py +0 -0
  305. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/regression.py +0 -0
  306. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/schemas.py +0 -0
  307. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/scripts.py +0 -0
  308. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/sec_scope.py +0 -0
  309. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/__init__.py +0 -0
  310. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/__init__.py +0 -0
  311. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  312. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  313. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  314. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  315. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/board.py +0 -0
  316. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/report.py +0 -0
  317. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/scaffold.py +0 -0
  318. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/spec_linter.py +0 -0
  319. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/skills/visualize.py +0 -0
  320. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/spec_status.py +0 -0
  321. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/test_mapper.py +0 -0
  322. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/utils.py +0 -0
  323. {pactkit-2.10.4 → pactkit-2.10.5}/src/pactkit/validators.py +0 -0
  324. {pactkit-2.10.4 → pactkit-2.10.5}/tests/conftest.py +0 -0
  325. {pactkit-2.10.4 → pactkit-2.10.5}/tests/e2e/__init__.py +0 -0
  326. {pactkit-2.10.4 → pactkit-2.10.5}/tests/e2e/cli/__init__.py +0 -0
  327. {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  328. {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  329. {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  330. {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  331. {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  332. {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  333. {pactkit-2.10.4 → pactkit-2.10.5}/tests/fixtures/api_call_parser/page.tsx +0 -0
  334. {pactkit-2.10.4 → pactkit-2.10.5}/tests/integration/__init__.py +0 -0
  335. {pactkit-2.10.4 → pactkit-2.10.5}/tests/integration/test_deploy_classic.py +0 -0
  336. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_agent_features.py +0 -0
  337. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_agent_frontmatter.py +0 -0
  338. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_agents_enrichment.py +0 -0
  339. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_audit.py +0 -0
  340. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_blast_radius.py +0 -0
  341. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_board_bug027.py +0 -0
  342. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_board_sections.py +0 -0
  343. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug001_skill_path.py +0 -0
  344. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug002_plugin_paths.py +0 -0
  345. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug003_multi_import.py +0 -0
  346. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug004_dead_set.py +0 -0
  347. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug005_archive_taskless.py +0 -0
  348. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug006_scan_excludes.py +0 -0
  349. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  350. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  351. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  352. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  353. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug011_stale_refs.py +0 -0
  354. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  355. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug014_version_hygiene.py +0 -0
  356. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  357. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  358. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug019_venv_deployment.py +0 -0
  359. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  360. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug025_release_delegation.py +0 -0
  361. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug028_ghost_refs.py +0 -0
  362. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  363. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  364. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  365. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  366. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_021.py +0 -0
  367. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_022.py +0 -0
  368. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_023.py +0 -0
  369. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_024.py +0 -0
  370. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  371. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  372. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim003.py +0 -0
  373. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim004.py +0 -0
  374. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim005.py +0 -0
  375. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim006.py +0 -0
  376. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  377. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_check_command.py +0 -0
  378. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_check_extensions_072_073.py +0 -0
  379. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_check_playbook_072_073.py +0 -0
  380. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_command_frontmatter.py +0 -0
  381. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_command_visualize_modes.py +0 -0
  382. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_complexity.py +0 -0
  383. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_constitution_sharpening.py +0 -0
  384. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_context_gen.py +0 -0
  385. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_create_skill.py +0 -0
  386. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_cross_flow_matrix.py +0 -0
  387. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_deploy_base.py +0 -0
  388. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_deployer_plugin.py +0 -0
  389. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_design_command.py +0 -0
  390. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_done_gates.py +0 -0
  391. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_draw_prompt.py +0 -0
  392. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_draw_references.py +0 -0
  393. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_drawio_mcp.py +0 -0
  394. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_garden.py +0 -0
  395. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_home_path_fix.py +0 -0
  396. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_hotfix_command.py +0 -0
  397. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_init_guard.py +0 -0
  398. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_init_playbook_074.py +0 -0
  399. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_lang_profiles.py +0 -0
  400. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_layer_violations.py +0 -0
  401. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_lessons_rotation_075.py +0 -0
  402. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_list_stories.py +0 -0
  403. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_mcp_integration.py +0 -0
  404. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_model_config.py +0 -0
  405. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_modular_constitution.py +0 -0
  406. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_monorepo_detect.py +0 -0
  407. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_multi_prefix.py +0 -0
  408. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_observe.py +0 -0
  409. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_pdca_slim.py +0 -0
  410. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_profiles.py +0 -0
  411. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_project_visibility.py +0 -0
  412. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompt_cli_refs.py +0 -0
  413. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompt_quality_075.py +0 -0
  414. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_prompts_package.py +0 -0
  415. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_release.py +0 -0
  416. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_release_field.py +0 -0
  417. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_render_prompt.py +0 -0
  418. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_report_parser.py +0 -0
  419. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_report_unified.py +0 -0
  420. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_review_command.py +0 -0
  421. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_rules_enrichment.py +0 -0
  422. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_scaffold.py +0 -0
  423. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  424. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_schemas.py +0 -0
  425. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_script_extraction.py +0 -0
  426. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_session_context.py +0 -0
  427. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_skill_structure.py +0 -0
  428. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_skills_enrichment.py +0 -0
  429. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_slim_deps_088.py +0 -0
  430. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_smart_regression.py +0 -0
  431. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_sprint_command.py +0 -0
  432. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_stack_references.py +0 -0
  433. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_status_command.py +0 -0
  434. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_statusline.py +0 -0
  435. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  436. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story016_claude_md.py +0 -0
  437. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story017_init_claude_md.py +0 -0
  438. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story018_arch_staleness.py +0 -0
  439. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story019_bailout.py +0 -0
  440. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story020_horizon.py +0 -0
  441. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story021_rfc.py +0 -0
  442. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story022_decision_tree.py +0 -0
  443. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story023_test_quality.py +0 -0
  444. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story024_native_agent.py +0 -0
  445. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story025_ci_pipeline.py +0 -0
  446. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story026_issue_tracker.py +0 -0
  447. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story027_hooks.py +0 -0
  448. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story028_rule_scoping.py +0 -0
  449. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story029_doctor.py +0 -0
  450. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story030_lint.py +0 -0
  451. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story031_git_init_guard.py +0 -0
  452. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  453. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  454. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story035_readme_docs.py +0 -0
  455. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story037_regression_fix.py +0 -0
  456. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story038_call_graph_update.py +0 -0
  457. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story039_venv_config.py +0 -0
  458. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story040_layered_claude_md.py +0 -0
  459. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story042_spec_linter.py +0 -0
  460. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story043_active_clarify.py +0 -0
  461. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story044_consistency_check.py +0 -0
  462. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story045_auto_pr.py +0 -0
  463. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story046_agent_adapter.py +0 -0
  464. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story047_enterprise_flags.py +0 -0
  465. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story048_worktree_isolation.py +0 -0
  466. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story049_community_standards.py +0 -0
  467. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  468. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  469. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story052_conditional_github_release.py +0 -0
  470. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story053_impact_regression.py +0 -0
  471. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story055_commands.py +0 -0
  472. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story055_config.py +0 -0
  473. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story055_spec_linter.py +0 -0
  474. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story056_commands.py +0 -0
  475. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story056_config.py +0 -0
  476. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  477. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story058_opencode_extraction.py +0 -0
  478. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story058_routing_fix.py +0 -0
  479. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story059_codex_removal.py +0 -0
  480. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story060_init_hang.py +0 -0
  481. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story061_remove_thinking.py +0 -0
  482. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  483. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story064_venv_local_md.py +0 -0
  484. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story065_sprint_model.py +0 -0
  485. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story072_developer_prefix.py +0 -0
  486. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  487. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim012_ci.py +0 -0
  488. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_clean.py +0 -0
  489. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_context.py +0 -0
  490. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_guard.py +0 -0
  491. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  492. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_next_id.py +0 -0
  493. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_regression.py +0 -0
  494. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  495. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim014_validators.py +0 -0
  496. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim015_doctor.py +0 -0
  497. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  498. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim017.py +0 -0
  499. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim018.py +0 -0
  500. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  501. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  502. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim022.py +0 -0
  503. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim024.py +0 -0
  504. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim025.py +0 -0
  505. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim027.py +0 -0
  506. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim028.py +0 -0
  507. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim029.py +0 -0
  508. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim030.py +0 -0
  509. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim031.py +0 -0
  510. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim032.py +0 -0
  511. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim033.py +0 -0
  512. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim034.py +0 -0
  513. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim035.py +0 -0
  514. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim036.py +0 -0
  515. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim037.py +0 -0
  516. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim038.py +0 -0
  517. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim039.py +0 -0
  518. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim040.py +0 -0
  519. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim041.py +0 -0
  520. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim042.py +0 -0
  521. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim043.py +0 -0
  522. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim044.py +0 -0
  523. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim045.py +0 -0
  524. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim046.py +0 -0
  525. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim047.py +0 -0
  526. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim048.py +0 -0
  527. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim049.py +0 -0
  528. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim051.py +0 -0
  529. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim052.py +0 -0
  530. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim053.py +0 -0
  531. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim054.py +0 -0
  532. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim055.py +0 -0
  533. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim056.py +0 -0
  534. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  535. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim063.py +0 -0
  536. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim065.py +0 -0
  537. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim076_multistack.py +0 -0
  538. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim078.py +0 -0
  539. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim079.py +0 -0
  540. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim080.py +0 -0
  541. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim081.py +0 -0
  542. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim082.py +0 -0
  543. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim083.py +0 -0
  544. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim084.py +0 -0
  545. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim095.py +0 -0
  546. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  547. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  548. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_tools.py +0 -0
  549. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_topology_parsers_066.py +0 -0
  550. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_update_task.py +0 -0
  551. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_call_nested.py +0 -0
  552. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_chain_fix.py +0 -0
  553. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_modes.py +0 -0
  554. {pactkit-2.10.4 → pactkit-2.10.5}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -20,7 +20,7 @@ jobs:
20
20
  - name: Install dependencies
21
21
  run: |
22
22
  python -m pip install --upgrade pip
23
- pip install -e .
23
+ pip install -e ".[visualize]"
24
24
  pip install pytest ruff
25
25
  pactkit init
26
26
 
@@ -4,6 +4,14 @@ All notable changes to PactKit will be documented in this file.
4
4
 
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/).
6
6
 
7
+ ## [2.10.5] - 2026-04-21
8
+
9
+ ### Added
10
+ - **Solution Design Protocol** (STORY-slim-101) — New rule `12-solution-design.md` requires capability delta assessment before implementation. Prevents framework blindness, project blindness, and hardcoded coupling. Includes Implementation Constraints (no magic values, OCP, SRP, dependency direction). Integrated into Plan Phase 1 and Act Phase 1.
11
+
12
+ ### Changed
13
+ - **Global version tracking** (STORY-slim-102) — Version tracking moved from project-level `pactkit.yaml` to global `~/.claude/.pactkit-version` marker. Eliminates cross-project desync when PactKit is upgraded. `auto_merge_config_file()` now removes stale `version` field from existing project yamls.
14
+
7
15
  ## [2.10.4] - 2026-04-20
8
16
 
9
17
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.10.4
3
+ Version: 2.10.5
4
4
  Summary: Spec-driven agentic DevOps toolkit for AI coding assistants
5
5
  Project-URL: Homepage, https://pactkit.dev
6
6
  Project-URL: Repository, https://github.com/pactkit/pactkit-public
@@ -48,3 +48,4 @@
48
48
  | 2026-03-24 | Standalone scripts (visualize.py) need try/except ImportError guards for yaml.safe_load when reading pactkit.yaml — they cannot import from pactkit library | visualize.py:_load_scan_excludes |
49
49
  | 2026-03-24 | Inline data in standalone scripts must have canonical-source comments pointing to the library module (e.g. _STACK_MARKERS → cleaners.py, _LANG_FILE_EXT → workflows.py) per Architecture Principle 1 | visualize.py:_STACK_MARKERS |
50
50
  | 2026-03-24 | Worktree isolation diverges from working-tree: verify visualize.py _scan_files() signature is preserved across stories to avoid breaking callers | visualize.py:_scan_files |
51
+ | 2026-03-24 | Extracting _detect_stack() from _detect_file_ext() enables both file discovery and test mapping to share stack detection — DRY refactoring | visualize.py:_detect_stack |
@@ -2,7 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-24 | Extracting _detect_stack() from _detect_file_ext() enables both file discovery and test mapping to share stack detection — DRY refactoring | visualize.py:_detect_stack |
6
5
  | 2026-03-24 | Standalone skill scripts using exec() require all imports in _SHARED_HEADER; new stdlib imports (dataclass) must be added to skills/__init__.py _SHARED_HEADER, not just the standalone header section | skills/__init__.py:_SHARED_HEADER |
7
6
  | 2026-03-24 | detect_topology() must delegate to _TOPOLOGY_PARSERS parser.detect() first, not _TOPOLOGY_MARKERS alone — parsers and markers can diverge silently causing empty graphs | visualize.py:detect_topology |
8
7
  | 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
@@ -53,3 +52,4 @@
53
52
  | 2026-04-20 | Plugin deployer (_deploy_commands in deployer.py:952-954) uses _rewrite_skills_prefix instead of _render_prompt, keeping raw placeholders like {BOARD_CMD} — not a deploy drift bug but by-design template behavior | src/pactkit/generators/deployer.py:_deploy_commands |
54
53
  | 2026-04-20 | pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals | cleaners.py:_inside_protected |
55
54
  | 2026-04-20 | Hotfix playbook lacked data-driven impact awareness — AI-only 'no side effects' checks miss high-fan-in functions. Adding lightweight .mmd graph reads makes the advisory concrete without blocking the fast-fix path. | workflows.py:HOTFIX_PROMPT |
55
+ | 2026-04-21 | Version tracking in pactkit.yaml caused cross-project desync — moved to ~/.claude/.pactkit-version as single source of truth for deploy state. config.py get_default_config() no longer includes version field. | STORY-slim-102 |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3762+ tests must pass before any commit to `main`.
18
+ 1. All 3787+ tests must pass before any commit to `main`.
19
19
  2. Specs (`docs/specs/`) are the source of truth — code conforms to specs, not the reverse.
20
20
  3. CLI entry point is `pactkit` via `src/pactkit/cli.py:main`.
21
21
  4. No runtime dependencies beyond `pyyaml`.
@@ -212,3 +212,18 @@
212
212
  - [x] Add Phase 0.5 Impact Check to HOTFIX_PROMPT
213
213
  - [x] Add tests for new phase
214
214
  - [x] Deploy verification
215
+
216
+ ### [STORY-slim-101] Solution Design Protocol Rule
217
+ > Spec: docs/specs/STORY-slim-101.md
218
+
219
+ - [x] Add RULE_12_SOLUTION_DESIGN to rules.py
220
+ - [x] Add to VALID_RULES in config.py
221
+ - [x] Add unit test
222
+
223
+ ### [STORY-slim-102] Move version tracking to global deploy marker
224
+ > Spec: docs/specs/STORY-slim-102.md
225
+
226
+ - [x] Write .pactkit-version in deployer
227
+ - [x] Update --if-needed to read global marker
228
+ - [x] Remove version from project yaml
229
+ - [x] Update tests
@@ -1,5 +1,5 @@
1
1
  # Project Context (Auto-generated)
2
- > Last updated: 2026-04-20T17:32:07+08:00 by pactkit context
2
+ > Last updated: 2026-04-21T17:13:02+08:00 by pactkit context
3
3
 
4
4
  ## Sprint Status
5
5
  Backlog: 0 | In Progress: 0 | Done: 0 stories
@@ -15,11 +15,11 @@ develop
15
15
  * main
16
16
 
17
17
  ## Key Decisions
18
- - Dual-anchor pattern: declare principle in RULES_MODULES['core'] (01-core-protocol.md), detail in dedicated module (11-pdca-nudge.md). Prevents attention dilution when rules/ has 10+ files — Core Protocol acts as behavioral constitution anchor.
19
18
  - Version comparison guards must use semantic (tuple) comparison, not string equality — string != treats 2.10.1 != 2.5.0 without direction, giving wrong upgrade advice
20
19
  - Plugin deployer (_deploy_commands in deployer.py:952-954) uses _rewrite_skills_prefix instead of _render_prompt, keeping raw placeholders like {BOARD_CMD} — not a deploy drift bug but by-design template behavior
21
20
  - pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals
22
21
  - Hotfix playbook lacked data-driven impact awareness — AI-only 'no side effects' checks miss high-fan-in functions. Adding lightweight .mmd graph reads makes the advisory concrete without blocking the fast-fix path.
22
+ - Version tracking in pactkit.yaml caused cross-project desync — moved to ~/.claude/.pactkit-version as single source of truth for deploy state. config.py get_default_config() no longer includes version field.
23
23
 
24
24
  ## Next Recommended Action
25
25
  `/project-design`
@@ -0,0 +1,155 @@
1
+ # STORY-slim-101: Solution Design Protocol Rule
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-101 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.10.5 |
9
+
10
+ ## Background
11
+
12
+ LLM tends to implement features using "quick and dirty" approaches that work but have poor maintainability, robustness, and extensibility. Three core anti-patterns observed:
13
+
14
+ 1. **Framework Blindness**: LLM doesn't know what native capabilities the framework provides, so it reinvents the wheel (e.g., writing custom context storage when LangGraph has memory store)
15
+ 2. **Project Blindness**: LLM doesn't check what the project has already encapsulated, so it bypasses existing abstractions (e.g., instantiating AzureChatOpenAI directly instead of using `get_precise_llm()`)
16
+ 3. **Hardcoded Dependencies**: LLM couples directly to framework internals instead of using project abstraction layers
17
+
18
+ Root cause: No protocol requires LLM to evaluate capability delta (framework native + project existing) before implementation. Information exists (Context7 for framework docs, grep for project code, call chain for dependencies) but LLM is not required to use it.
19
+
20
+ ## Requirements
21
+
22
+ ### R1: Rule File Creation (MUST)
23
+
24
+ Create `~/.claude/rules/12-solution-design.md` containing the Solution Design Protocol that defines capability assessment before implementation.
25
+
26
+ ### R2: Framework Capability Query (MUST)
27
+
28
+ The protocol MUST define a prioritized query path for framework native capabilities:
29
+ 1. Context7 MCP (if available) — real-time, authoritative
30
+ 2. WebFetch official docs (if network available) — real-time, requires parsing
31
+ 3. AI training data (fallback) — must declare framework version to avoid outdated APIs
32
+
33
+ ### R3: Project Capability Discovery (MUST)
34
+
35
+ The protocol MUST define methods to discover project existing capabilities:
36
+ - Grep import statements to find framework usage
37
+ - Grep factory function patterns (`get_*`, `build_*`, `create_*`) to find encapsulated capabilities
38
+ - Pattern match wiring layer files (`wiring.py`, `deps.py`, `container.*`, `di.*`, `providers.*`)
39
+ - Use call chain visualization for dependency analysis
40
+
41
+ ### R4: Delta Assessment Matrix (MUST)
42
+
43
+ The protocol MUST define a decision matrix based on capability delta:
44
+ - Framework has & project not used → prefer enabling framework capability
45
+ - Framework has & project encapsulated → reuse project abstraction, do not bypass
46
+ - Neither has → only then implement new
47
+
48
+ ### R5: Decision Constraints (MUST)
49
+
50
+ The protocol MUST enforce:
51
+ - MUST NOT bypass project abstraction layer to use framework directly
52
+ - SHOULD prefer framework native over custom implementation
53
+ - MUST state reasoning if not using available framework capability
54
+
55
+ ### R6: Output Format (SHOULD)
56
+
57
+ The protocol SHOULD define output format for:
58
+ - Plan phase: Technical Design section in Spec
59
+ - Act phase: Brief assessment output before implementation
60
+
61
+ ### R7: Stack-Agnostic Design (MUST)
62
+
63
+ The protocol MUST be stack-agnostic, supporting dependency files for:
64
+ - Python: `pyproject.toml`, `requirements.txt`
65
+ - Node: `package.json`
66
+ - Go: `go.mod`
67
+ - Java: `pom.xml`, `build.gradle`
68
+ - Rust: `Cargo.toml`
69
+
70
+ ### R8: Playbook Integration (MUST)
71
+
72
+ The rule MUST be integrated into PDCA playbooks:
73
+ - `project-plan.md`: Add `@~/.claude/rules/12-solution-design.md` import and reference protocol in Phase 1
74
+ - `project-act.md`: Add `@~/.claude/rules/12-solution-design.md` import and reference protocol in Phase 1
75
+
76
+ ## Acceptance Criteria
77
+
78
+ ### AC1: Rule File Exists (R1)
79
+
80
+ - **Given** PactKit rules directory at `~/.claude/rules/`
81
+ - **When** `pactkit init` or `pactkit deploy` is run
82
+ - **Then** `12-solution-design.md` is deployed with full protocol content
83
+
84
+ ### AC2: Framework Query Fallback Chain (R2)
85
+
86
+ - **Given** A requirement involving a framework (e.g., LangGraph)
87
+ - **When** Solution Design Protocol is executed
88
+ - **Then** Framework capabilities are queried via Context7 → WebFetch → Training Data fallback chain
89
+
90
+ ### AC3: Project Capability Discovery (R3)
91
+
92
+ - **Given** A project with `pyproject.toml` listing `langgraph>=0.4`
93
+ - **When** Solution Design Protocol Step 3 is executed
94
+ - **Then** Protocol identifies: (a) framework imports in src/, (b) factory functions like `get_*`/`build_*`, (c) wiring layer files
95
+
96
+ ### AC4: Delta Assessment Decision (R4)
97
+
98
+ - **Given** Framework has memory store capability, project has checkpointer but not memory
99
+ - **When** Requirement is "add cross-session context"
100
+ - **Then** Protocol recommends "enable framework capability" not "implement custom"
101
+
102
+ ### AC5: Abstraction Bypass Prevention (R5)
103
+
104
+ - **Given** Project has `get_precise_llm()` in wiring.py
105
+ - **When** LLM attempts to directly instantiate AzureChatOpenAI
106
+ - **Then** Protocol constraint blocks this and directs to use existing encapsulation
107
+
108
+ ### AC6: Output Format in Spec (R6)
109
+
110
+ - **Given** Plan phase executes Solution Design Protocol
111
+ - **When** Capability assessment is complete
112
+ - **Then** Output is written to `## Technical Design` section with: capability table, reuse points, new implementation list
113
+
114
+ ### AC7: Multi-Stack Support (R7)
115
+
116
+ - **Given** A Node.js project with `package.json`
117
+ - **When** Solution Design Protocol Step 1 is executed
118
+ - **Then** Protocol correctly reads dependencies from `package.json` not `pyproject.toml`
119
+
120
+ ### AC8: Playbook References Protocol (R8)
121
+
122
+ - **Given** User runs `/project-plan` or `/project-act`
123
+ - **When** Phase 1 executes
124
+ - **Then** Solution Design Protocol is triggered for requirements involving frameworks
125
+
126
+ ## Target Call Chain
127
+
128
+ Not applicable — this is a new rule file, not modifying existing code.
129
+
130
+ ## Implementation Steps
131
+
132
+ | Step | File | Action | Dependencies | Risk |
133
+ |------|------|--------|-------------|------|
134
+ | 1 | `src/pactkit/prompts/rules.py` | Add `RULE_12_SOLUTION_DESIGN` constant with full protocol content | None | Low |
135
+ | 2 | `src/pactkit/config.py` | Add `12-solution-design` to `VALID_RULES` | Step 1 | Low |
136
+ | 3 | `src/pactkit/prompts/commands.py` | Update `COMMAND_PLAN` and `COMMAND_ACT` to import rule and reference protocol in Phase 1 | Step 1 | Medium |
137
+ | 4 | `tests/unit/test_rules.py` | Add test for new rule deployment | Steps 1-3 | Low |
138
+
139
+ ## Security Scope
140
+
141
+ | Check | Applicable | Reason |
142
+ |-------|------------|--------|
143
+ | SEC-1 | N/A | No secrets — rule file contains only protocol text |
144
+ | SEC-2 | N/A | No user input handling — rule file is static content |
145
+ | SEC-3 | N/A | No database operations |
146
+ | SEC-4 | N/A | No frontend code |
147
+ | SEC-5 | N/A | No authentication logic |
148
+ | SEC-6 | N/A | No API endpoints |
149
+ | SEC-7 | N/A | No error handling code |
150
+ | SEC-8 | N/A | No dependency changes |
151
+
152
+ ## Out of Scope
153
+
154
+ - Auto-generation of capability index files — protocol uses dynamic discovery
155
+ - Framework-specific capability lists — protocol relies on Context7/WebFetch for real-time data
@@ -0,0 +1,135 @@
1
+ # STORY-slim-102: Move version tracking from project yaml to global deploy marker
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-102 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.10.5 |
9
+
10
+ ## Background
11
+
12
+ The `version` field in project-level `pactkit.yaml` tracks which PactKit version last deployed. When PactKit is upgraded via `pipx upgrade pactkit`, running `pactkit update` in one project updates that project's yaml, but all other projects remain stale. This causes `pactkit update --if-needed` (triggered every session by Core Protocol) to report mismatch and run a full redeploy in every other project — even though the global deployment directory (`~/.claude/`) is already up to date.
13
+
14
+ Root cause: version tracking is in the wrong place. Project yaml's role is **configuration** (which agents/skills/rules to deploy). Deployment **state** (which version last deployed) should live in the global deployment directory alongside the deployed files.
15
+
16
+ ### Current Flow (broken cross-project)
17
+ ```
18
+ pipx upgrade pactkit → __version__ = 2.10.5
19
+ cd projectA → pactkit update → projectA yaml = 2.10.5, ~/.claude/ = 2.10.5 ✓
20
+ cd projectB → pactkit update --if-needed → projectB yaml = 2.10.1 ≠ 2.10.5 → full redeploy (unnecessary)
21
+ ```
22
+
23
+ ### Target Flow
24
+ ```
25
+ pipx upgrade pactkit → __version__ = 2.10.5
26
+ cd projectA → pactkit update → ~/.claude/.pactkit-version = 2.10.5 ✓
27
+ cd projectB → pactkit update --if-needed → reads ~/.claude/.pactkit-version = 2.10.5 → skip ✓
28
+ ```
29
+
30
+ ## Requirements
31
+
32
+ ### R1: Global Version Marker (MUST)
33
+
34
+ Classic deployer MUST write `~/.claude/.pactkit-version` containing `__version__` after successful deployment. This is the single source of truth for "which version is currently deployed globally."
35
+
36
+ ### R2: Update --if-needed Reads Global Marker (MUST)
37
+
38
+ `pactkit update --if-needed` MUST read `~/.claude/.pactkit-version` (not project yaml) to decide whether to skip. If the marker matches `__version__`, skip. If missing or mismatched, proceed to deploy.
39
+
40
+ ### R3: Remove version from Project YAML (MUST)
41
+
42
+ - `get_default_config()` MUST NOT include a `version` key
43
+ - `auto_merge_config_file()` MUST NOT sync version — and MUST remove existing `version` field if present (cleanup migration)
44
+ - `_rewrite_yaml()` MUST NOT write a version line
45
+ - `load_config()` MUST NOT break if `version` key is absent
46
+
47
+ ### R4: Guard Version Check Uses Global Marker (MUST)
48
+
49
+ `check_version_mismatch()` in `guards.py` MUST read the global marker instead of project yaml version.
50
+
51
+ ## Acceptance Criteria
52
+
53
+ ### AC1: Global Marker Written on Deploy (R1)
54
+
55
+ - **Given** `~/.claude/.pactkit-version` does not exist or has old version
56
+ - **When** `pactkit update` runs successfully
57
+ - **Then** `~/.claude/.pactkit-version` contains `__version__` (e.g., `2.10.5`)
58
+
59
+ ### AC2: Skip When Global Marker Matches (R2)
60
+
61
+ - **Given** `~/.claude/.pactkit-version` contains `2.10.5` and `__version__ == 2.10.5`
62
+ - **When** `pactkit update --if-needed` is run from any project directory
63
+ - **Then** Output is `"PactKit 2.10.5 up-to-date — skipping redeploy"` and exit code 0
64
+
65
+ ### AC3: Deploy When Global Marker Mismatches (R2)
66
+
67
+ - **Given** `~/.claude/.pactkit-version` contains `2.10.1` and `__version__ == 2.10.5`
68
+ - **When** `pactkit update --if-needed` is run
69
+ - **Then** Full deploy executes and marker is updated to `2.10.5`
70
+
71
+ ### AC4: Default Config Has No Version (R3)
72
+
73
+ - **Given** `get_default_config()` is called
74
+ - **When** Result is inspected
75
+ - **Then** No `version` key exists in the returned dict
76
+
77
+ ### AC5: Auto-merge Removes Stale Version (R3)
78
+
79
+ - **Given** A project yaml with `version: "2.10.1"` and stale components
80
+ - **When** `auto_merge_config_file()` is called
81
+ - **Then** New components are added AND `version` field is removed from the yaml file
82
+
83
+ ### AC6: Guard Uses Global Marker (R4)
84
+
85
+ - **Given** `~/.claude/.pactkit-version` matches `__version__`
86
+ - **When** `pactkit guard` is run from a project with stale yaml version
87
+ - **Then** No version mismatch warning is printed
88
+
89
+ ### AC7: Old YAML With Version Still Loads (R3)
90
+
91
+ - **Given** A project yaml containing `version: "2.10.1"` (legacy field not yet cleaned)
92
+ - **When** `load_config()` is called
93
+ - **Then** Config loads without error
94
+
95
+ ## Target Call Chain
96
+
97
+ ```
98
+ pactkit update --if-needed
99
+ → cli.py: read ~/.claude/.pactkit-version (R2)
100
+ → if match: skip, exit 0
101
+ → if mismatch: deploy() → _deploy_classic()
102
+ → deployer.py: write ~/.claude/.pactkit-version (R1)
103
+
104
+ pactkit guard
105
+ → guards.py: check_version_mismatch()
106
+ → read ~/.claude/.pactkit-version (R4)
107
+ ```
108
+
109
+ ## Implementation Steps
110
+
111
+ | Step | File | Action | Dependencies | Risk |
112
+ |------|------|--------|-------------|------|
113
+ | 1 | `src/pactkit/generators/deployer.py` | Write `.pactkit-version` at end of `_deploy_classic()` | None | Low |
114
+ | 2 | `src/pactkit/cli.py` | Change `--if-needed` to read global marker | Step 1 | Low |
115
+ | 3 | `src/pactkit/guards.py` | Change `check_version_mismatch()` to read global marker | Step 1 | Low |
116
+ | 4 | `src/pactkit/config.py` | Remove `version` from `get_default_config()`, `auto_merge`, `_rewrite_yaml` | None | Medium |
117
+ | 5 | `tests/unit/` | Update version-related tests | Steps 1-4 | Low |
118
+
119
+ ## Security Scope
120
+
121
+ | Check | Applicable | Reason |
122
+ |-------|------------|--------|
123
+ | SEC-1 | N/A | No secrets |
124
+ | SEC-2 | N/A | No user input handling |
125
+ | SEC-3 | N/A | No database operations |
126
+ | SEC-4 | N/A | No frontend code |
127
+ | SEC-5 | N/A | No authentication logic |
128
+ | SEC-6 | N/A | No API endpoints |
129
+ | SEC-7 | N/A | No error handling code |
130
+ | SEC-8 | N/A | No dependency changes |
131
+
132
+ ## Out of Scope
133
+
134
+ - Adapter packages (codex, copilot, opencode) — they already have their own `.pactkit-version` mechanism
135
+ - Plugin/marketplace manifests — `version` in `plugin.json` and `marketplace.json` is package metadata, not deployment state
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pactkit"
7
- version = "2.10.4"
7
+ version = "2.10.5"
8
8
  description = "Spec-driven agentic DevOps toolkit for AI coding assistants"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """PactKit - Spec-driven agentic DevOps toolkit."""
2
2
 
3
- __version__ = "2.10.4"
3
+ __version__ = "2.10.5"
@@ -350,20 +350,16 @@ def main():
350
350
  args = parser.parse_args()
351
351
 
352
352
  if args.command in ("init", "update", "upgrade"):
353
- # STORY-slim-023: --if-needed skips deploy when versions match
353
+ # STORY-slim-102: --if-needed checks global deploy marker, not project yaml
354
354
  if args.command == "update" and getattr(args, "if_needed", False):
355
355
  from pathlib import Path
356
356
 
357
- from pactkit.config import load_config
358
-
359
- yaml_path = Path.cwd() / ".claude" / "pactkit.yaml"
360
- if yaml_path.exists():
361
- cfg = load_config(yaml_path)
362
- yaml_version = cfg.get("version", "")
363
- if yaml_version == __version__:
357
+ marker = Path.home() / ".claude" / ".pactkit-version"
358
+ if marker.exists():
359
+ deployed_version = marker.read_text().strip()
360
+ if deployed_version == __version__:
364
361
  print(f"PactKit {__version__} up-to-date — skipping redeploy")
365
362
  raise SystemExit(0)
366
- print(f"PactKit version mismatch: {yaml_version} → {__version__}. Updating...")
367
363
  else:
368
364
  print("No pactkit.yaml found. Running first-time setup...")
369
365
 
@@ -9,8 +9,6 @@ from typing import Union
9
9
 
10
10
  import yaml
11
11
 
12
- from pactkit import __version__
13
-
14
12
  # ---------------------------------------------------------------------------
15
13
  # Valid identifiers (the registry of all known components)
16
14
  # ---------------------------------------------------------------------------
@@ -88,6 +86,7 @@ VALID_RULES = frozenset(
88
86
  "08-architecture-principles",
89
87
  "09-sectional-write",
90
88
  "11-pdca-nudge",
89
+ "12-solution-design",
91
90
  }
92
91
  )
93
92
 
@@ -154,7 +153,6 @@ class PactKitConfig:
154
153
  def get_default_config() -> dict:
155
154
  """Return the default config with all components enabled."""
156
155
  return {
157
- "version": __version__,
158
156
  "stack": "auto",
159
157
  "root": ".",
160
158
  "developer": "",
@@ -511,10 +509,10 @@ def auto_merge_config_file(path: Union[Path, str]) -> list[str]:
511
509
  user_data[key] = defaults[key]
512
510
  added.append(f"section: {key}")
513
511
 
514
- # BUG-026: Sync version to installed __version__
515
- if user_data.get("version") != __version__:
516
- user_data["version"] = __version__
517
- added.append(f"version: {__version__}")
512
+ # STORY-slim-102: Remove stale version field from project yaml
513
+ if "version" in user_data:
514
+ del user_data["version"]
515
+ added.append("removed: version (now tracked globally)")
518
516
 
519
517
  if added:
520
518
  _rewrite_yaml(path, user_data)
@@ -582,7 +580,6 @@ def _rewrite_yaml(path: Path, data: dict) -> None:
582
580
  "# Edit this file to customize which components are deployed.",
583
581
  "# Remove items from a list to disable them. Default: all enabled.",
584
582
  "",
585
- f'version: "{__version__}"',
586
583
  _render_stack_line(data.get('stack', 'auto')),
587
584
  f"root: {data.get('root', '.')}",
588
585
  f'developer: "{data.get("developer", "")}"',
@@ -996,7 +993,6 @@ def generate_default_yaml(stack=None) -> str:
996
993
  "# All agents, commands, skills, and rules are deployed by default.",
997
994
  "# To exclude specific items, add an exclude list (e.g., exclude_skills: [pactkit-draw]).",
998
995
  "",
999
- f'version: "{cfg["version"]}"',
1000
996
  _render_stack_line(cfg['stack']),
1001
997
  f"root: {cfg['root']}",
1002
998
  f'developer: "{cfg["developer"]}"',
@@ -397,6 +397,10 @@ def _deploy_classic(config=None, target=None):
397
397
  f"({n_skills} embedded + {n_commands} commands), "
398
398
  f"{n_rules}/{total_rules} Rules"
399
399
  )
400
+
401
+ # STORY-slim-102: Write global version marker
402
+ atomic_write(claude_root / ".pactkit-version", f"{__version__}\n")
403
+
400
404
  _print_mcp_recommendations()
401
405
 
402
406
 
@@ -7,7 +7,7 @@ from __future__ import annotations
7
7
  from pathlib import Path
8
8
 
9
9
  from pactkit import __version__
10
- from pactkit.config import find_pactkit_yaml, load_config
10
+ from pactkit.config import find_pactkit_yaml
11
11
 
12
12
 
13
13
  def check_init_markers(project_root: Path) -> tuple[bool, list[str]]:
@@ -76,33 +76,37 @@ def _parse_version(v: str) -> tuple[int, ...]:
76
76
  return ()
77
77
 
78
78
 
79
+ def _get_global_version_marker() -> Path:
80
+ """Return path to the global deploy version marker."""
81
+ return Path.home() / ".claude" / ".pactkit-version"
82
+
83
+
79
84
  def check_version_mismatch(project_root: Path) -> str | None:
80
- """Check if pactkit.yaml version differs from installed __version__.
85
+ """Check if global deploy marker version differs from installed __version__.
81
86
 
82
87
  Returns:
83
- Warning message if mismatch, None if versions match or yaml not found.
88
+ Warning message if mismatch, None if versions match or marker not found.
84
89
  """
85
- yaml_path = find_pactkit_yaml(project_root)
86
- if yaml_path is None:
90
+ marker = _get_global_version_marker()
91
+ if not marker.exists():
87
92
  return None
88
93
 
89
- cfg = load_config(yaml_path)
90
- yaml_version = cfg.get("version", "")
91
- if not yaml_version or yaml_version == __version__:
94
+ deployed_version = marker.read_text().strip()
95
+ if not deployed_version or deployed_version == __version__:
92
96
  return None
93
97
 
94
- yaml_v = _parse_version(yaml_version)
98
+ deployed_v = _parse_version(deployed_version)
95
99
  installed_v = _parse_version(__version__)
96
100
 
97
- if not yaml_v or not installed_v:
98
- return f"Version mismatch: pactkit.yaml {yaml_version} vs installed {__version__}"
101
+ if not deployed_v or not installed_v:
102
+ return f"Version mismatch: deployed {deployed_version} vs installed {__version__}"
99
103
 
100
- if yaml_v > installed_v:
104
+ if deployed_v > installed_v:
101
105
  return (
102
- f"Version mismatch: pactkit.yaml {yaml_version} > installed {__version__}\n"
106
+ f"Version mismatch: deployed {deployed_version} > installed {__version__}\n"
103
107
  f" Run `pipx upgrade pactkit` to update the CLI"
104
108
  )
105
109
  return (
106
- f"Version mismatch: pactkit.yaml {yaml_version} < installed {__version__}\n"
110
+ f"Version mismatch: deployed {deployed_version} < installed {__version__}\n"
107
111
  f" Run `pactkit update` to sync"
108
112
  )
@@ -79,6 +79,9 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
79
79
  3. **Topology-Aware Trace (Conditional)** — if `detect_topology(root)` includes `api_call` or `agent`:
80
80
  - For **api_call**: Run `api_convention_summary(root)` and include path prefixes, fetch function names, and total call count in the Archaeologist Report. This prevents API path convention bugs in downstream implementation.
81
81
  - For **agent**: Note orchestration edges from AgentParser (LangGraph/YAML/MCP) in the report so downstream changes respect agent flow.
82
+ 4. **Solution Design Protocol (Conditional)** — if the requirement involves frameworks already used by the project:
83
+ - Execute the **Solution Design Protocol** from `12-solution-design.md` to evaluate capability delta (framework native + project existing vs. needs implementation).
84
+ - Include the Capability Assessment output in Phase 2 Spec writing.
82
85
 
83
86
  ## 🎬 Phase 2: Design & Impact
84
87
  1. **Diff**: Compare User Request vs Current Reality (from Phase 1).
@@ -175,6 +178,9 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
175
178
  3. **Topology-Aware Trace (Conditional)** — if `detect_topology(root)` includes `api_call` or `agent`:
176
179
  - For **api_call**: Run `api_convention_summary(root)` to check API path prefixes and fetch function conventions. Use these conventions when writing new API calls to maintain consistency.
177
180
  - For **agent**: Check AgentParser output for orchestration edges so new code doesn't break agent flow.
181
+ 4. **Solution Design Protocol (Conditional)** — if the implementation involves frameworks already used by the project:
182
+ - Execute the **Solution Design Protocol** from `12-solution-design.md` to evaluate capability delta before writing code.
183
+ - Output brief capability assessment before proceeding to Phase 2.
178
184
 
179
185
  ## 🎬 Phase 2: Test Scaffolding (TDD)
180
186
  1. **Constraint**: NEVER write source code in this phase — doing so breaks TDD causality: tests must exist before the code they verify.