pactkit 2.10.4__tar.gz → 2.10.6__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 (558) hide show
  1. {pactkit-2.10.4 → pactkit-2.10.6}/.github/workflows/pactkit.yml +1 -1
  2. {pactkit-2.10.4 → pactkit-2.10.6}/CHANGELOG.md +13 -0
  3. {pactkit-2.10.4 → pactkit-2.10.6}/PKG-INFO +3 -3
  4. {pactkit-2.10.4 → pactkit-2.10.6}/README.md +2 -2
  5. {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/archive/lessons_archive_202603.md +2 -0
  6. {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/lessons.md +3 -3
  7. {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/rules.md +1 -1
  8. {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/archive/archive_202604.md +29 -0
  9. pactkit-2.10.6/docs/product/context.md +28 -0
  10. pactkit-2.10.6/docs/specs/STORY-slim-101.md +155 -0
  11. pactkit-2.10.6/docs/specs/STORY-slim-102.md +135 -0
  12. pactkit-2.10.6/docs/specs/STORY-slim-103.md +100 -0
  13. pactkit-2.10.6/docs/specs/STORY-slim-104.md +77 -0
  14. {pactkit-2.10.4 → pactkit-2.10.6}/pyproject.toml +1 -1
  15. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/__init__.py +1 -1
  16. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/cli.py +5 -9
  17. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/config.py +5 -9
  18. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/deployer.py +4 -0
  19. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/guards.py +18 -14
  20. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/commands.py +6 -0
  21. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/rules.py +162 -7
  22. {pactkit-2.10.4 → pactkit-2.10.6}/tests/e2e/cli/test_cli_e2e.py +13 -15
  23. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug013_config_single_source.py +2 -1
  24. pactkit-2.10.6/tests/unit/test_bug026_version_sync.py +186 -0
  25. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_config.py +8 -6
  26. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_config_auto_merge.py +3 -5
  27. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_deployer_cleanup.py +10 -5
  28. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompt_structural_invariants.py +2 -2
  29. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_release_v110.py +3 -3
  30. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_selective_deploy.py +2 -1
  31. pactkit-2.10.6/tests/unit/test_solution_design_rule.py +137 -0
  32. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story014_release.py +3 -6
  33. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story033_config_backfill.py +3 -3
  34. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story063_prompt_slimming.py +2 -1
  35. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim010_dry_refactor.py +4 -5
  36. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim011_command_rules.py +2 -2
  37. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim021.py +2 -2
  38. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim023.py +25 -8
  39. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim026.py +2 -2
  40. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim077_monorepo_stack.py +4 -3
  41. pactkit-2.10.6/tests/unit/test_story_slim102_version_marker.py +146 -0
  42. pactkit-2.10.6/tests/unit/test_story_slim104_should_semantics.py +29 -0
  43. pactkit-2.10.4/docs/product/context.md +0 -28
  44. pactkit-2.10.4/tests/unit/test_bug026_version_sync.py +0 -153
  45. {pactkit-2.10.4 → pactkit-2.10.6}/.github/workflows/publish.yml +0 -0
  46. {pactkit-2.10.4 → pactkit-2.10.6}/.gitignore +0 -0
  47. {pactkit-2.10.4 → pactkit-2.10.6}/.opencode/pactkit.yaml +0 -0
  48. {pactkit-2.10.4 → pactkit-2.10.6}/AGENTS.md +0 -0
  49. {pactkit-2.10.4 → pactkit-2.10.6}/CODE_OF_CONDUCT.md +0 -0
  50. {pactkit-2.10.4 → pactkit-2.10.6}/CONTRIBUTING.md +0 -0
  51. {pactkit-2.10.4 → pactkit-2.10.6}/LICENSE +0 -0
  52. {pactkit-2.10.4 → pactkit-2.10.6}/SECURITY.md +0 -0
  53. {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  54. {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/harness_audit.json +0 -0
  55. {pactkit-2.10.4 → pactkit-2.10.6}/docs/architecture/governance/philosophy.md +0 -0
  56. {pactkit-2.10.4 → pactkit-2.10.6}/docs/assets/logo.png +0 -0
  57. {pactkit-2.10.4 → pactkit-2.10.6}/docs/guides/codex-integration-preresearch.md +0 -0
  58. {pactkit-2.10.4 → pactkit-2.10.6}/docs/guides/tool-integration-checklist.md +0 -0
  59. {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/archive/archive_202602.md +0 -0
  60. {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/archive/archive_202603.md +0 -0
  61. {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/friction-log.md +0 -0
  62. {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/prd.md +0 -0
  63. {pactkit-2.10.4 → pactkit-2.10.6}/docs/product/sprint_board.md +0 -0
  64. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-001.md +0 -0
  65. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-002.md +0 -0
  66. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-003.md +0 -0
  67. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-004.md +0 -0
  68. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-005.md +0 -0
  69. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-006.md +0 -0
  70. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-007.md +0 -0
  71. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-008.md +0 -0
  72. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-009.md +0 -0
  73. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-010.md +0 -0
  74. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-011.md +0 -0
  75. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-012.md +0 -0
  76. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-013.md +0 -0
  77. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-014.md +0 -0
  78. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-015.md +0 -0
  79. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-016.md +0 -0
  80. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-017.md +0 -0
  81. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-018.md +0 -0
  82. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-019.md +0 -0
  83. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-020.md +0 -0
  84. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-021.md +0 -0
  85. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-022.md +0 -0
  86. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-023.md +0 -0
  87. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-024.md +0 -0
  88. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-025.md +0 -0
  89. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-026.md +0 -0
  90. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-027.md +0 -0
  91. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-028.md +0 -0
  92. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-029.md +0 -0
  93. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-030.md +0 -0
  94. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-031.md +0 -0
  95. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-032.md +0 -0
  96. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-033.md +0 -0
  97. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-034.md +0 -0
  98. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-035.md +0 -0
  99. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-001.md +0 -0
  100. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-002.md +0 -0
  101. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-003.md +0 -0
  102. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-004.md +0 -0
  103. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-005.md +0 -0
  104. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-006.md +0 -0
  105. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/BUG-slim-089.md +0 -0
  106. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-023.md +0 -0
  107. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-049.md +0 -0
  108. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-050.md +0 -0
  109. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-051.md +0 -0
  110. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-052.md +0 -0
  111. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-061.md +0 -0
  112. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-062.md +0 -0
  113. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-067.md +0 -0
  114. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-069.md +0 -0
  115. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-070.md +0 -0
  116. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-085.md +0 -0
  117. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-087.md +0 -0
  118. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-096.md +0 -0
  119. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/HOTFIX-slim-099.md +0 -0
  120. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-001.md +0 -0
  121. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-002.md +0 -0
  122. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-003.md +0 -0
  123. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-004.md +0 -0
  124. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-005.md +0 -0
  125. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-006.md +0 -0
  126. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-007.md +0 -0
  127. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-008.md +0 -0
  128. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-009.md +0 -0
  129. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-010.md +0 -0
  130. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-011.md +0 -0
  131. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-012.md +0 -0
  132. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-013.md +0 -0
  133. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-014.md +0 -0
  134. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-015.md +0 -0
  135. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-016.md +0 -0
  136. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-017.md +0 -0
  137. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-018.md +0 -0
  138. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-019.md +0 -0
  139. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-020.md +0 -0
  140. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-021.md +0 -0
  141. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-022.md +0 -0
  142. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-023.md +0 -0
  143. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-024.md +0 -0
  144. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-025.md +0 -0
  145. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-026.md +0 -0
  146. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-027.md +0 -0
  147. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-028.md +0 -0
  148. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-029.md +0 -0
  149. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-030.md +0 -0
  150. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-031.md +0 -0
  151. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-032.md +0 -0
  152. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-033.md +0 -0
  153. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-034.md +0 -0
  154. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-035.md +0 -0
  155. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-036.md +0 -0
  156. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-037.md +0 -0
  157. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-038.md +0 -0
  158. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-039.md +0 -0
  159. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-040.md +0 -0
  160. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-041.md +0 -0
  161. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-042.md +0 -0
  162. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-043.md +0 -0
  163. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-044.md +0 -0
  164. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-045.md +0 -0
  165. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-046.md +0 -0
  166. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-047.md +0 -0
  167. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-048.md +0 -0
  168. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-049.md +0 -0
  169. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-050.md +0 -0
  170. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-051.md +0 -0
  171. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-052.md +0 -0
  172. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-053.md +0 -0
  173. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-054.md +0 -0
  174. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-055.md +0 -0
  175. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-056.md +0 -0
  176. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-057.md +0 -0
  177. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-058.md +0 -0
  178. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-059.md +0 -0
  179. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-060.md +0 -0
  180. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-061.md +0 -0
  181. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-062.md +0 -0
  182. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-063.md +0 -0
  183. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-064.md +0 -0
  184. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-065.md +0 -0
  185. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-069.md +0 -0
  186. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-070.md +0 -0
  187. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-071.md +0 -0
  188. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-072.md +0 -0
  189. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-073.md +0 -0
  190. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-001.md +0 -0
  191. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-005.md +0 -0
  192. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-006.md +0 -0
  193. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-007.md +0 -0
  194. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-009.md +0 -0
  195. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-010.md +0 -0
  196. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-011.md +0 -0
  197. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-012.md +0 -0
  198. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-013.md +0 -0
  199. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-014.md +0 -0
  200. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-015.md +0 -0
  201. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-016.md +0 -0
  202. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-017.md +0 -0
  203. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-018.md +0 -0
  204. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-019.md +0 -0
  205. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-020.md +0 -0
  206. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-021.md +0 -0
  207. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-022.md +0 -0
  208. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-023.md +0 -0
  209. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-024.md +0 -0
  210. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-028.md +0 -0
  211. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-029.md +0 -0
  212. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-030.md +0 -0
  213. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-031.md +0 -0
  214. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-032.md +0 -0
  215. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-033.md +0 -0
  216. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-034.md +0 -0
  217. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-035.md +0 -0
  218. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-036.md +0 -0
  219. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-037.md +0 -0
  220. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-038.md +0 -0
  221. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-039.md +0 -0
  222. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-040.md +0 -0
  223. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-041.md +0 -0
  224. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-042.md +0 -0
  225. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-043.md +0 -0
  226. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-044.md +0 -0
  227. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-045.md +0 -0
  228. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-046.md +0 -0
  229. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-047.md +0 -0
  230. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-048.md +0 -0
  231. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-049.md +0 -0
  232. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-050.md +0 -0
  233. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-051.md +0 -0
  234. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-052.md +0 -0
  235. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-053.md +0 -0
  236. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-054.md +0 -0
  237. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-055.md +0 -0
  238. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-056.md +0 -0
  239. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-057.md +0 -0
  240. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-058.md +0 -0
  241. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-059.md +0 -0
  242. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-060.md +0 -0
  243. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-063.md +0 -0
  244. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-066.md +0 -0
  245. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-067.md +0 -0
  246. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-068.md +0 -0
  247. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-069.md +0 -0
  248. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-070.md +0 -0
  249. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-071.md +0 -0
  250. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-072.md +0 -0
  251. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-073.md +0 -0
  252. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-074.md +0 -0
  253. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-075.md +0 -0
  254. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-076.md +0 -0
  255. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-077.md +0 -0
  256. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-078.md +0 -0
  257. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-079.md +0 -0
  258. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-080.md +0 -0
  259. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-081.md +0 -0
  260. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-082.md +0 -0
  261. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-083.md +0 -0
  262. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-084.md +0 -0
  263. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-086.md +0 -0
  264. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-088.md +0 -0
  265. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-089.md +0 -0
  266. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-090.md +0 -0
  267. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-091.md +0 -0
  268. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-092.md +0 -0
  269. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-093.md +0 -0
  270. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-094.md +0 -0
  271. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-095.md +0 -0
  272. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-097.md +0 -0
  273. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-098.md +0 -0
  274. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-099.md +0 -0
  275. {pactkit-2.10.4 → pactkit-2.10.6}/docs/specs/STORY-slim-100.md +0 -0
  276. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/BUG-001_case.md +0 -0
  277. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/BUG-002_case.md +0 -0
  278. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-028_case.md +0 -0
  279. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-029_case.md +0 -0
  280. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-031_case.md +0 -0
  281. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-032_case.md +0 -0
  282. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-033_case.md +0 -0
  283. {pactkit-2.10.4 → pactkit-2.10.6}/docs/test_cases/STORY-slim-034_case.md +0 -0
  284. {pactkit-2.10.4 → pactkit-2.10.6}/opencode.json +0 -0
  285. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/__main__.py +0 -0
  286. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/audit.py +0 -0
  287. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/backfill.py +0 -0
  288. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/cleaners.py +0 -0
  289. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/context_gen.py +0 -0
  290. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/coverage_gate.py +0 -0
  291. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/doctor.py +0 -0
  292. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/garden.py +0 -0
  293. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/__init__.py +0 -0
  294. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/adapter.py +0 -0
  295. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/generators/deploy_base.py +0 -0
  296. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/id_generator.py +0 -0
  297. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/invariants.py +0 -0
  298. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/issue_sync.py +0 -0
  299. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/lazy_visualize.py +0 -0
  300. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/lessons.py +0 -0
  301. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/lint_runner.py +0 -0
  302. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/observe.py +0 -0
  303. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/profiles.py +0 -0
  304. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/__init__.py +0 -0
  305. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/agents.py +0 -0
  306. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/references.py +0 -0
  307. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/skills.py +0 -0
  308. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/prompts/workflows.py +0 -0
  309. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/regression.py +0 -0
  310. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/schemas.py +0 -0
  311. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/scripts.py +0 -0
  312. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/sec_scope.py +0 -0
  313. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/__init__.py +0 -0
  314. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/__init__.py +0 -0
  315. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  316. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  317. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  318. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  319. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/board.py +0 -0
  320. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/report.py +0 -0
  321. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/scaffold.py +0 -0
  322. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/spec_linter.py +0 -0
  323. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/skills/visualize.py +0 -0
  324. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/spec_status.py +0 -0
  325. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/test_mapper.py +0 -0
  326. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/utils.py +0 -0
  327. {pactkit-2.10.4 → pactkit-2.10.6}/src/pactkit/validators.py +0 -0
  328. {pactkit-2.10.4 → pactkit-2.10.6}/tests/conftest.py +0 -0
  329. {pactkit-2.10.4 → pactkit-2.10.6}/tests/e2e/__init__.py +0 -0
  330. {pactkit-2.10.4 → pactkit-2.10.6}/tests/e2e/cli/__init__.py +0 -0
  331. {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  332. {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  333. {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  334. {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  335. {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  336. {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  337. {pactkit-2.10.4 → pactkit-2.10.6}/tests/fixtures/api_call_parser/page.tsx +0 -0
  338. {pactkit-2.10.4 → pactkit-2.10.6}/tests/integration/__init__.py +0 -0
  339. {pactkit-2.10.4 → pactkit-2.10.6}/tests/integration/test_deploy_classic.py +0 -0
  340. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_agent_features.py +0 -0
  341. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_agent_frontmatter.py +0 -0
  342. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_agents_enrichment.py +0 -0
  343. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_audit.py +0 -0
  344. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_blast_radius.py +0 -0
  345. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_board_bug027.py +0 -0
  346. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_board_sections.py +0 -0
  347. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug001_skill_path.py +0 -0
  348. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug002_plugin_paths.py +0 -0
  349. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug003_multi_import.py +0 -0
  350. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug004_dead_set.py +0 -0
  351. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug005_archive_taskless.py +0 -0
  352. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug006_scan_excludes.py +0 -0
  353. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  354. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  355. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  356. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  357. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug011_stale_refs.py +0 -0
  358. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  359. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug014_version_hygiene.py +0 -0
  360. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  361. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  362. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug019_venv_deployment.py +0 -0
  363. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  364. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug025_release_delegation.py +0 -0
  365. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug028_ghost_refs.py +0 -0
  366. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  367. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  368. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  369. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  370. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_021.py +0 -0
  371. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_022.py +0 -0
  372. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_023.py +0 -0
  373. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_024.py +0 -0
  374. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  375. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  376. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim003.py +0 -0
  377. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim004.py +0 -0
  378. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim005.py +0 -0
  379. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim006.py +0 -0
  380. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  381. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_check_command.py +0 -0
  382. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_check_extensions_072_073.py +0 -0
  383. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_check_playbook_072_073.py +0 -0
  384. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_command_frontmatter.py +0 -0
  385. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_command_visualize_modes.py +0 -0
  386. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_complexity.py +0 -0
  387. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_constitution_sharpening.py +0 -0
  388. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_context_gen.py +0 -0
  389. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_create_skill.py +0 -0
  390. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_cross_flow_matrix.py +0 -0
  391. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_deploy_base.py +0 -0
  392. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_deployer_plugin.py +0 -0
  393. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_design_command.py +0 -0
  394. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_done_gates.py +0 -0
  395. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_draw_prompt.py +0 -0
  396. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_draw_references.py +0 -0
  397. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_drawio_mcp.py +0 -0
  398. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_garden.py +0 -0
  399. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_home_path_fix.py +0 -0
  400. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_hotfix_command.py +0 -0
  401. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_init_guard.py +0 -0
  402. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_init_playbook_074.py +0 -0
  403. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_lang_profiles.py +0 -0
  404. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_layer_violations.py +0 -0
  405. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_lessons_rotation_075.py +0 -0
  406. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_list_stories.py +0 -0
  407. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_mcp_integration.py +0 -0
  408. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_model_config.py +0 -0
  409. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_modular_constitution.py +0 -0
  410. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_monorepo_detect.py +0 -0
  411. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_multi_prefix.py +0 -0
  412. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_observe.py +0 -0
  413. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_pdca_slim.py +0 -0
  414. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_profiles.py +0 -0
  415. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_project_visibility.py +0 -0
  416. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompt_cli_refs.py +0 -0
  417. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompt_quality_075.py +0 -0
  418. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_prompts_package.py +0 -0
  419. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_release.py +0 -0
  420. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_release_field.py +0 -0
  421. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_render_prompt.py +0 -0
  422. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_report_parser.py +0 -0
  423. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_report_unified.py +0 -0
  424. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_review_command.py +0 -0
  425. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_rules_enrichment.py +0 -0
  426. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_scaffold.py +0 -0
  427. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  428. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_schemas.py +0 -0
  429. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_script_extraction.py +0 -0
  430. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_session_context.py +0 -0
  431. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_skill_structure.py +0 -0
  432. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_skills_enrichment.py +0 -0
  433. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_slim_deps_088.py +0 -0
  434. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_smart_regression.py +0 -0
  435. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_sprint_command.py +0 -0
  436. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_stack_references.py +0 -0
  437. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_status_command.py +0 -0
  438. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_statusline.py +0 -0
  439. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  440. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story016_claude_md.py +0 -0
  441. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story017_init_claude_md.py +0 -0
  442. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story018_arch_staleness.py +0 -0
  443. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story019_bailout.py +0 -0
  444. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story020_horizon.py +0 -0
  445. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story021_rfc.py +0 -0
  446. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story022_decision_tree.py +0 -0
  447. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story023_test_quality.py +0 -0
  448. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story024_native_agent.py +0 -0
  449. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story025_ci_pipeline.py +0 -0
  450. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story026_issue_tracker.py +0 -0
  451. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story027_hooks.py +0 -0
  452. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story028_rule_scoping.py +0 -0
  453. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story029_doctor.py +0 -0
  454. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story030_lint.py +0 -0
  455. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story031_git_init_guard.py +0 -0
  456. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  457. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  458. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story035_readme_docs.py +0 -0
  459. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story037_regression_fix.py +0 -0
  460. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story038_call_graph_update.py +0 -0
  461. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story039_venv_config.py +0 -0
  462. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story040_layered_claude_md.py +0 -0
  463. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story042_spec_linter.py +0 -0
  464. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story043_active_clarify.py +0 -0
  465. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story044_consistency_check.py +0 -0
  466. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story045_auto_pr.py +0 -0
  467. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story046_agent_adapter.py +0 -0
  468. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story047_enterprise_flags.py +0 -0
  469. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story048_worktree_isolation.py +0 -0
  470. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story049_community_standards.py +0 -0
  471. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  472. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  473. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story052_conditional_github_release.py +0 -0
  474. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story053_impact_regression.py +0 -0
  475. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story055_commands.py +0 -0
  476. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story055_config.py +0 -0
  477. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story055_spec_linter.py +0 -0
  478. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story056_commands.py +0 -0
  479. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story056_config.py +0 -0
  480. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  481. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story058_opencode_extraction.py +0 -0
  482. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story058_routing_fix.py +0 -0
  483. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story059_codex_removal.py +0 -0
  484. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story060_init_hang.py +0 -0
  485. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story061_remove_thinking.py +0 -0
  486. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  487. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story064_venv_local_md.py +0 -0
  488. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story065_sprint_model.py +0 -0
  489. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story072_developer_prefix.py +0 -0
  490. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  491. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim012_ci.py +0 -0
  492. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_clean.py +0 -0
  493. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_context.py +0 -0
  494. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_guard.py +0 -0
  495. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  496. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_next_id.py +0 -0
  497. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_regression.py +0 -0
  498. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  499. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim014_validators.py +0 -0
  500. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim015_doctor.py +0 -0
  501. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  502. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim017.py +0 -0
  503. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim018.py +0 -0
  504. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  505. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  506. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim022.py +0 -0
  507. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim024.py +0 -0
  508. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim025.py +0 -0
  509. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim027.py +0 -0
  510. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim028.py +0 -0
  511. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim029.py +0 -0
  512. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim030.py +0 -0
  513. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim031.py +0 -0
  514. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim032.py +0 -0
  515. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim033.py +0 -0
  516. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim034.py +0 -0
  517. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim035.py +0 -0
  518. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim036.py +0 -0
  519. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim037.py +0 -0
  520. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim038.py +0 -0
  521. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim039.py +0 -0
  522. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim040.py +0 -0
  523. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim041.py +0 -0
  524. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim042.py +0 -0
  525. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim043.py +0 -0
  526. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim044.py +0 -0
  527. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim045.py +0 -0
  528. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim046.py +0 -0
  529. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim047.py +0 -0
  530. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim048.py +0 -0
  531. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim049.py +0 -0
  532. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim051.py +0 -0
  533. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim052.py +0 -0
  534. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim053.py +0 -0
  535. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim054.py +0 -0
  536. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim055.py +0 -0
  537. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim056.py +0 -0
  538. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  539. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim063.py +0 -0
  540. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim065.py +0 -0
  541. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim076_multistack.py +0 -0
  542. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim078.py +0 -0
  543. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim079.py +0 -0
  544. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim080.py +0 -0
  545. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim081.py +0 -0
  546. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim082.py +0 -0
  547. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim083.py +0 -0
  548. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim084.py +0 -0
  549. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim095.py +0 -0
  550. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  551. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  552. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_tools.py +0 -0
  553. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_topology_parsers_066.py +0 -0
  554. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_update_task.py +0 -0
  555. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_visualize_call_nested.py +0 -0
  556. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_visualize_chain_fix.py +0 -0
  557. {pactkit-2.10.4 → pactkit-2.10.6}/tests/unit/test_visualize_modes.py +0 -0
  558. {pactkit-2.10.4 → pactkit-2.10.6}/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,19 @@ 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.6] - 2026-04-22
8
+
9
+ ### Fixed
10
+ - **L3 SHOULD semantics** (STORY-slim-104) — Signal Strength Convention L3 Recommended changed from "Violation = warning, non-blocking" to "Default required — skip only with stated reason" (RFC 2119). Added clarification bullet that SHOULD is not optional. Prevents AI from systematically deferring SHOULD tasks.
11
+
12
+ ## [2.10.5] - 2026-04-21
13
+
14
+ ### Added
15
+ - **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.
16
+
17
+ ### Changed
18
+ - **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.
19
+
7
20
  ## [2.10.4] - 2026-04-20
8
21
 
9
22
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.10.4
3
+ Version: 2.10.6
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
@@ -41,13 +41,13 @@ Requires-Dist: tree-sitter>=0.25; extra == 'visualize'
41
41
  Description-Content-Type: text/markdown
42
42
 
43
43
  <p align="center">
44
- <img src="https://raw.githubusercontent.com/pactkit/pactkit/main/docs/assets/logo.png" alt="PactKit" width="480" />
44
+ <img src="https://raw.githubusercontent.com/pactkit/pactkit-src/main/docs/assets/logo.png" alt="PactKit" width="480" />
45
45
  </p>
46
46
 
47
47
  <p align="center">
48
48
  <a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/v/pactkit" alt="PyPI version" /></a>
49
49
  <a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/pyversions/pactkit" alt="Python" /></a>
50
- <a href="https://github.com/pactkit/pactkit/actions/workflows/ci.yml"><img src="https://github.com/pactkit/pactkit/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
50
+ <a href="https://github.com/pactkit/pactkit-src/actions"><img src="https://github.com/pactkit/pactkit-src/actions/workflows/pactkit.yml/badge.svg" alt="CI" /></a>
51
51
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT" /></a>
52
52
  </p>
53
53
 
@@ -1,11 +1,11 @@
1
1
  <p align="center">
2
- <img src="https://raw.githubusercontent.com/pactkit/pactkit/main/docs/assets/logo.png" alt="PactKit" width="480" />
2
+ <img src="https://raw.githubusercontent.com/pactkit/pactkit-src/main/docs/assets/logo.png" alt="PactKit" width="480" />
3
3
  </p>
4
4
 
5
5
  <p align="center">
6
6
  <a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/v/pactkit" alt="PyPI version" /></a>
7
7
  <a href="https://pypi.org/project/pactkit/"><img src="https://img.shields.io/pypi/pyversions/pactkit" alt="Python" /></a>
8
- <a href="https://github.com/pactkit/pactkit/actions/workflows/ci.yml"><img src="https://github.com/pactkit/pactkit/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
8
+ <a href="https://github.com/pactkit/pactkit-src/actions"><img src="https://github.com/pactkit/pactkit-src/actions/workflows/pactkit.yml/badge.svg" alt="CI" /></a>
9
9
  <a href="LICENSE"><img src="https://img.shields.io/badge/License-MIT-blue.svg" alt="License: MIT" /></a>
10
10
  </p>
11
11
 
@@ -48,3 +48,5 @@
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 |
52
+ | 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 |
@@ -2,9 +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
- | 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
- | 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
5
  | 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 |
9
6
  | 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
10
7
  | 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
@@ -53,3 +50,6 @@
53
50
  | 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
51
  | 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
52
  | 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 |
53
+ | 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 |
54
+ | 2026-04-22 | When the same bug pattern recurs 3+ times across specs (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054), promote the fix from spec-level to a standing rule in 08-architecture-principles.md — ad-hoc spec fixes do not prevent recurrence | ~/.claude/rules/08-architecture-principles.md:§9 |
55
+ | 2026-04-22 | Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act | src/pactkit/prompts/rules.py:51 |
@@ -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 3790+ 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,32 @@
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
230
+
231
+ ### [STORY-slim-103] Rules anti-pattern: Merge-over-Replace + Parameterize-over-Hardcode
232
+ > Spec: docs/specs/STORY-slim-103.md
233
+
234
+ - [x] Add §9 to 08-architecture-principles
235
+ - [x] Expand No Magic Values in 12-solution-design
236
+ - [x] Verify no new rules files
237
+
238
+ ### [STORY-slim-104] Fix L3 SHOULD semantics in Signal Strength Convention
239
+ > Spec: docs/specs/STORY-slim-104.md
240
+
241
+ - [x] Change L3 Semantics text in rules.py
242
+ - [x] Add SHOULD clarification note
243
+ - [x] Add test for L3 content
@@ -0,0 +1,28 @@
1
+ # Project Context (Auto-generated)
2
+ > Last updated: 2026-04-22T19:00:19+08:00 by pactkit context
3
+
4
+ ## Sprint Status
5
+ Backlog: 0 | In Progress: 0 | Done: 0 stories
6
+
7
+ ## Current Stories
8
+ None
9
+
10
+ ## Recent Completions
11
+ None
12
+
13
+ ## Active Branches
14
+ develop
15
+ * main
16
+
17
+ ## Key Decisions
18
+ - pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals
19
+ - 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.
20
+ - 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.
21
+ - When the same bug pattern recurs 3+ times across specs (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054), promote the fix from spec-level to a standing rule in 08-architecture-principles.md — ad-hoc spec fixes do not prevent recurrence
22
+ - Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act
23
+
24
+ ## Next Recommended Action
25
+ `/project-design`
26
+
27
+ ## Agent Continuation
28
+ No active work session.
@@ -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
@@ -0,0 +1,100 @@
1
+ # STORY-slim-103: Rules anti-pattern: add Merge-over-Replace and Parameterize-over-Hardcode to existing rules
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-103 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.10.6 |
9
+
10
+ ## Background
11
+
12
+ LLM has two systematic design biases that current rules fail to counter:
13
+
14
+ 1. **Full-replace bias**: LLM defaults to full file overwrites (Write tool) instead of incremental edits (Edit tool / merge). This has caused 5+ bugs in PactKit history (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054) where user config was silently destroyed.
15
+
16
+ 2. **Hardcode bias**: LLM defaults to writing concrete values inline instead of extracting configurable parameters. The existing `No Magic Values` constraint in `12-solution-design.md` only covers code implementation — it misses rules, Specs, configs, and playbooks.
17
+
18
+ Both biases are LLM cognitive shortcuts (lower token cost, simpler reasoning). Without standing rules, each occurrence is discovered as a bug post-facto and fixed as a one-off spec, never promoted to a reusable principle.
19
+
20
+ ### PDCA Coverage Map (Rules → Commands)
21
+
22
+ | Rules File | Referenced By |
23
+ |---|---|
24
+ | `08-architecture-principles.md` | Plan, Act, Design, Sprint |
25
+ | `12-solution-design.md` | Plan (Phase 1), Act (Phase 1) |
26
+
27
+ Both target files are loaded into context during architecture decisions (08) and implementation design (12) — the exact phases where these biases manifest.
28
+
29
+ ## Requirements
30
+
31
+ ### R1: Merge over Replace Principle in 08-architecture-principles.md (MUST)
32
+
33
+ Add §9 to `~/.claude/rules/08-architecture-principles.md` establishing "Merge over Replace" as a standing architecture principle:
34
+ - Signal level: L3 SHOULD (non-blocking, but violation = data loss risk)
35
+ - MUST include a Decision Matrix: when full-replace is safe vs. when incremental merge is required
36
+ - MUST define the criteria: "If the target file may contain user-modified content or sections managed by other tools, use incremental merge"
37
+ - SHOULD reference the 5 historical bugs as evidence (without bloating the rule)
38
+
39
+ ### R2: Expand No Magic Values to All Artifacts in 12-solution-design.md (MUST)
40
+
41
+ Expand the existing `No Magic Values` constraint in `12-solution-design.md` Implementation Constraints:
42
+ - Broaden scope from "code implementation" to "all artifacts" (rules, Specs, configs, playbooks, prompts)
43
+ - Add a **Flexibility Litmus Test**: "If changing this value requires grep + multi-file edits, it should be parameterized"
44
+ - Add explicit examples for non-code artifacts (rule thresholds, path patterns, tool names)
45
+
46
+ ### R3: No New Rules Files (MUST NOT)
47
+
48
+ MUST NOT create any new rules file. All changes MUST be edits to existing `08-architecture-principles.md` and `12-solution-design.md` — violation breaks the user's constraint of keeping the rules count stable.
49
+
50
+ ## Acceptance Criteria
51
+
52
+ ### AC1: Merge over Replace principle exists in 08 (R1)
53
+
54
+ - **Given** `08-architecture-principles.md` is loaded by Plan/Act/Design/Sprint
55
+ - **When** LLM reads the file during any PDCA command
56
+ - **Then** §9 "Merge over Replace" is present with a Decision Matrix distinguishing safe-to-replace vs. must-merge scenarios
57
+
58
+ ### AC2: No Magic Values scope covers all artifacts (R2)
59
+
60
+ - **Given** `12-solution-design.md` is loaded by Plan/Act
61
+ - **When** LLM enters Implementation Constraints during Solution Design Protocol
62
+ - **Then** "No Magic Values" explicitly states it applies to rules, Specs, configs, playbooks — not just code
63
+ - **Then** a Flexibility Litmus Test is present ("If changing this value requires grep + multi-file edits → parameterize")
64
+
65
+ ### AC3: No new rules files created (R3)
66
+
67
+ - **Given** the current rules directory has N files
68
+ - **When** this story is implemented
69
+ - **Then** the rules directory still has exactly N files (no additions, no deletions)
70
+
71
+ ## Target Call Chain
72
+
73
+ N/A — this story modifies rules files (prompt-level artifacts), not source code. No call chain.
74
+
75
+ ## Implementation Steps
76
+
77
+ | Step | File | Action | Dependencies | Risk |
78
+ |------|------|--------|-------------|------|
79
+ | 1 | `~/.claude/rules/08-architecture-principles.md` | Add §9 Merge over Replace with Decision Matrix after §8 | None | Low |
80
+ | 2 | `~/.claude/rules/12-solution-design.md` | Expand No Magic Values scope + add Flexibility Litmus Test | None | Low |
81
+ | 3 | Verify | Confirm no new files in `~/.claude/rules/`, spec-lint passes | Step 1-2 | Low |
82
+
83
+ ## Security Scope
84
+
85
+ | Check | Applicable | Reason |
86
+ |-------|------------|--------|
87
+ | SEC-1 Input Validation | N/A | Docs/rules only |
88
+ | SEC-2 Auth/AuthZ | N/A | Docs/rules only |
89
+ | SEC-3 Data Exposure | N/A | Docs/rules only |
90
+ | SEC-4 Injection | N/A | Docs/rules only |
91
+ | SEC-5 Cryptography | N/A | Docs/rules only |
92
+ | SEC-6 Dependency | N/A | Docs/rules only |
93
+ | SEC-7 Logging | N/A | Docs/rules only |
94
+ | SEC-8 Config | N/A | Docs/rules only |
95
+
96
+ ## Out of Scope
97
+
98
+ - Modifying PDCA skill files (skill.md) — the `@` references already load 08 and 12, no skill changes needed
99
+ - Adding enforcement tooling (linter, hook) — this story adds principles only; automation is a separate story
100
+ - Modifying PactKit source code — rules files are prompt-level artifacts
@@ -0,0 +1,77 @@
1
+ # STORY-slim-104: Fix L3 SHOULD semantics in Signal Strength Convention
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-104 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.10.6 |
9
+
10
+ ## Background
11
+
12
+ Signal Strength Convention 表中 L3 Recommended 的 Semantics 列当前定义为 "Violation = warning, non-blocking"。这个措辞让 AI 将 SHOULD 误解为 "可以不做",导致 Spec 中标记为 SHOULD 的 task 被系统性 defer。
13
+
14
+ RFC 2119 对 SHOULD 的正确定义是:"除非有充分理由,否则必须做"(there may exist valid reasons to ignore a particular item, but the full implications must be understood and carefully weighed before choosing a different course)。当前措辞与 RFC 2119 语义不符。
15
+
16
+ **实际影响**: 观测到 AI 在 Act 阶段完成所有 MUST task 后,将全部 SHOULD task defer,给出的理由包括 "context 太长"、"改动大下次做" 等。这些 SHOULD task 最终全部被补回,总共只花 15 分钟。
17
+
18
+ **Canonical source**: `src/pactkit/prompts/rules.py:51`,`RULES_MODULES["core"]` 模板字符串。
19
+
20
+ ## Requirements
21
+
22
+ ### R1: Fix L3 Semantics to RFC 2119 (MUST)
23
+
24
+ Change L3 Recommended row Semantics from `Violation = warning, non-blocking` to `Default required — skip only with stated reason`. This aligns with RFC 2119 SHOULD semantics: the default is to do it, and skipping requires an explicit, stated justification.
25
+
26
+ ### R2: Add SHOULD clarification note (SHOULD)
27
+
28
+ Add a bullet point after the table clarifying that `SHOULD` (L3) is NOT optional — it means "do unless you have a stated reason not to". This prevents the table's compact format from being misread.
29
+
30
+ ## Acceptance Criteria
31
+
32
+ ### AC1: L3 Semantics text updated (R1)
33
+
34
+ - **Given** `src/pactkit/prompts/rules.py` contains the Signal Strength Convention table
35
+ - **When** I read the L3 Recommended row
36
+ - **Then** the Semantics column reads `Default required — skip only with stated reason` (not `Violation = warning, non-blocking`)
37
+
38
+ ### AC2: Clarification note present (R2)
39
+
40
+ - **Given** `src/pactkit/prompts/rules.py` contains the Signal Strength Convention section
41
+ - **When** I read the bullet points after the table
42
+ - **Then** there is a bullet clarifying that SHOULD (L3) is not optional — skipping requires a stated reason
43
+
44
+ ### AC3: Deployed rules file reflects change (R1, R2)
45
+
46
+ - **Given** pactkit has been deployed via `pactkit init` or `pactkit deploy`
47
+ - **When** I read `~/.claude/rules/01-core-protocol.md`
48
+ - **Then** the L3 row and clarification note match the source in `rules.py`
49
+
50
+ ## Target Call Chain
51
+
52
+ `RULES_MODULES["core"]` (rules.py:4) → `deployer._deploy_rules()` → writes `01-core-protocol.md`
53
+
54
+ ## Implementation Steps
55
+
56
+ | Step | File | Action | Dependencies | Risk |
57
+ |------|------|--------|-------------|------|
58
+ | 1 | `src/pactkit/prompts/rules.py` | Change L3 Semantics text + add SHOULD clarification bullet | None | Low |
59
+ | 2 | `tests/` | Add/update test verifying L3 row content | Step 1 | Low |
60
+
61
+ ## Security Scope
62
+
63
+ | Check | Applicable | Reason |
64
+ |-------|------------|--------|
65
+ | SEC-1 | N/A | Prompt text change only, no code execution logic |
66
+ | SEC-2 | N/A | No user input handling |
67
+ | SEC-3 | N/A | No database patterns |
68
+ | SEC-4 | N/A | No frontend files |
69
+ | SEC-5 | N/A | No auth/session logic |
70
+ | SEC-6 | N/A | No API/route files |
71
+ | SEC-7 | N/A | No error handling logic |
72
+ | SEC-8 | N/A | No dependency changes |
73
+
74
+ ## Out of Scope
75
+
76
+ - STORY-slim-086 Spec 中的中文版表格(历史记录,不影响部署)
77
+ - 其他 rules 文件中对 SHOULD 的使用(语义由此表定义,使用方不需改)
@@ -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.6"
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.6"