pactkit 2.10.3__tar.gz → 2.10.4__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 (549) hide show
  1. {pactkit-2.10.3 → pactkit-2.10.4}/.opencode/pactkit.yaml +1 -1
  2. {pactkit-2.10.3 → pactkit-2.10.4}/CHANGELOG.md +5 -0
  3. {pactkit-2.10.3 → pactkit-2.10.4}/PKG-INFO +1 -1
  4. {pactkit-2.10.3 → pactkit-2.10.4}/docs/architecture/governance/archive/lessons_archive_202603.md +1 -0
  5. {pactkit-2.10.3 → pactkit-2.10.4}/docs/architecture/governance/lessons.md +1 -1
  6. {pactkit-2.10.3 → pactkit-2.10.4}/docs/architecture/governance/rules.md +1 -1
  7. {pactkit-2.10.3 → pactkit-2.10.4}/docs/product/archive/archive_202604.md +7 -0
  8. {pactkit-2.10.3 → pactkit-2.10.4}/docs/product/context.md +2 -2
  9. pactkit-2.10.4/docs/specs/STORY-slim-100.md +87 -0
  10. {pactkit-2.10.3 → pactkit-2.10.4}/pyproject.toml +1 -1
  11. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/__init__.py +1 -1
  12. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/prompts/workflows.py +10 -0
  13. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_hotfix_command.py +37 -0
  14. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story063_prompt_slimming.py +2 -1
  15. {pactkit-2.10.3 → pactkit-2.10.4}/.github/workflows/pactkit.yml +0 -0
  16. {pactkit-2.10.3 → pactkit-2.10.4}/.github/workflows/publish.yml +0 -0
  17. {pactkit-2.10.3 → pactkit-2.10.4}/.gitignore +0 -0
  18. {pactkit-2.10.3 → pactkit-2.10.4}/AGENTS.md +0 -0
  19. {pactkit-2.10.3 → pactkit-2.10.4}/CODE_OF_CONDUCT.md +0 -0
  20. {pactkit-2.10.3 → pactkit-2.10.4}/CONTRIBUTING.md +0 -0
  21. {pactkit-2.10.3 → pactkit-2.10.4}/LICENSE +0 -0
  22. {pactkit-2.10.3 → pactkit-2.10.4}/README.md +0 -0
  23. {pactkit-2.10.3 → pactkit-2.10.4}/SECURITY.md +0 -0
  24. {pactkit-2.10.3 → pactkit-2.10.4}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  25. {pactkit-2.10.3 → pactkit-2.10.4}/docs/architecture/governance/harness_audit.json +0 -0
  26. {pactkit-2.10.3 → pactkit-2.10.4}/docs/architecture/governance/philosophy.md +0 -0
  27. {pactkit-2.10.3 → pactkit-2.10.4}/docs/assets/logo.png +0 -0
  28. {pactkit-2.10.3 → pactkit-2.10.4}/docs/guides/codex-integration-preresearch.md +0 -0
  29. {pactkit-2.10.3 → pactkit-2.10.4}/docs/guides/tool-integration-checklist.md +0 -0
  30. {pactkit-2.10.3 → pactkit-2.10.4}/docs/product/archive/archive_202602.md +0 -0
  31. {pactkit-2.10.3 → pactkit-2.10.4}/docs/product/archive/archive_202603.md +0 -0
  32. {pactkit-2.10.3 → pactkit-2.10.4}/docs/product/friction-log.md +0 -0
  33. {pactkit-2.10.3 → pactkit-2.10.4}/docs/product/prd.md +0 -0
  34. {pactkit-2.10.3 → pactkit-2.10.4}/docs/product/sprint_board.md +0 -0
  35. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-001.md +0 -0
  36. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-002.md +0 -0
  37. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-003.md +0 -0
  38. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-004.md +0 -0
  39. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-005.md +0 -0
  40. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-006.md +0 -0
  41. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-007.md +0 -0
  42. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-008.md +0 -0
  43. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-009.md +0 -0
  44. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-010.md +0 -0
  45. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-011.md +0 -0
  46. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-012.md +0 -0
  47. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-013.md +0 -0
  48. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-014.md +0 -0
  49. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-015.md +0 -0
  50. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-016.md +0 -0
  51. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-017.md +0 -0
  52. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-018.md +0 -0
  53. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-019.md +0 -0
  54. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-020.md +0 -0
  55. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-021.md +0 -0
  56. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-022.md +0 -0
  57. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-023.md +0 -0
  58. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-024.md +0 -0
  59. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-025.md +0 -0
  60. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-026.md +0 -0
  61. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-027.md +0 -0
  62. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-028.md +0 -0
  63. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-029.md +0 -0
  64. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-030.md +0 -0
  65. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-031.md +0 -0
  66. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-032.md +0 -0
  67. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-033.md +0 -0
  68. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-034.md +0 -0
  69. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-035.md +0 -0
  70. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-slim-001.md +0 -0
  71. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-slim-002.md +0 -0
  72. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-slim-003.md +0 -0
  73. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-slim-004.md +0 -0
  74. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-slim-005.md +0 -0
  75. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-slim-006.md +0 -0
  76. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/BUG-slim-089.md +0 -0
  77. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-023.md +0 -0
  78. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-049.md +0 -0
  79. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-050.md +0 -0
  80. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-051.md +0 -0
  81. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-052.md +0 -0
  82. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-061.md +0 -0
  83. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-062.md +0 -0
  84. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-067.md +0 -0
  85. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-069.md +0 -0
  86. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-070.md +0 -0
  87. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-085.md +0 -0
  88. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-087.md +0 -0
  89. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-096.md +0 -0
  90. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/HOTFIX-slim-099.md +0 -0
  91. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-001.md +0 -0
  92. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-002.md +0 -0
  93. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-003.md +0 -0
  94. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-004.md +0 -0
  95. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-005.md +0 -0
  96. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-006.md +0 -0
  97. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-007.md +0 -0
  98. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-008.md +0 -0
  99. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-009.md +0 -0
  100. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-010.md +0 -0
  101. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-011.md +0 -0
  102. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-012.md +0 -0
  103. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-013.md +0 -0
  104. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-014.md +0 -0
  105. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-015.md +0 -0
  106. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-016.md +0 -0
  107. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-017.md +0 -0
  108. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-018.md +0 -0
  109. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-019.md +0 -0
  110. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-020.md +0 -0
  111. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-021.md +0 -0
  112. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-022.md +0 -0
  113. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-023.md +0 -0
  114. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-024.md +0 -0
  115. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-025.md +0 -0
  116. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-026.md +0 -0
  117. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-027.md +0 -0
  118. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-028.md +0 -0
  119. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-029.md +0 -0
  120. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-030.md +0 -0
  121. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-031.md +0 -0
  122. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-032.md +0 -0
  123. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-033.md +0 -0
  124. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-034.md +0 -0
  125. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-035.md +0 -0
  126. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-036.md +0 -0
  127. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-037.md +0 -0
  128. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-038.md +0 -0
  129. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-039.md +0 -0
  130. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-040.md +0 -0
  131. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-041.md +0 -0
  132. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-042.md +0 -0
  133. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-043.md +0 -0
  134. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-044.md +0 -0
  135. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-045.md +0 -0
  136. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-046.md +0 -0
  137. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-047.md +0 -0
  138. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-048.md +0 -0
  139. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-049.md +0 -0
  140. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-050.md +0 -0
  141. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-051.md +0 -0
  142. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-052.md +0 -0
  143. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-053.md +0 -0
  144. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-054.md +0 -0
  145. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-055.md +0 -0
  146. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-056.md +0 -0
  147. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-057.md +0 -0
  148. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-058.md +0 -0
  149. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-059.md +0 -0
  150. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-060.md +0 -0
  151. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-061.md +0 -0
  152. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-062.md +0 -0
  153. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-063.md +0 -0
  154. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-064.md +0 -0
  155. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-065.md +0 -0
  156. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-069.md +0 -0
  157. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-070.md +0 -0
  158. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-071.md +0 -0
  159. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-072.md +0 -0
  160. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-073.md +0 -0
  161. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-001.md +0 -0
  162. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-005.md +0 -0
  163. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-006.md +0 -0
  164. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-007.md +0 -0
  165. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-009.md +0 -0
  166. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-010.md +0 -0
  167. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-011.md +0 -0
  168. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-012.md +0 -0
  169. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-013.md +0 -0
  170. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-014.md +0 -0
  171. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-015.md +0 -0
  172. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-016.md +0 -0
  173. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-017.md +0 -0
  174. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-018.md +0 -0
  175. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-019.md +0 -0
  176. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-020.md +0 -0
  177. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-021.md +0 -0
  178. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-022.md +0 -0
  179. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-023.md +0 -0
  180. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-024.md +0 -0
  181. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-028.md +0 -0
  182. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-029.md +0 -0
  183. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-030.md +0 -0
  184. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-031.md +0 -0
  185. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-032.md +0 -0
  186. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-033.md +0 -0
  187. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-034.md +0 -0
  188. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-035.md +0 -0
  189. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-036.md +0 -0
  190. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-037.md +0 -0
  191. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-038.md +0 -0
  192. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-039.md +0 -0
  193. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-040.md +0 -0
  194. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-041.md +0 -0
  195. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-042.md +0 -0
  196. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-043.md +0 -0
  197. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-044.md +0 -0
  198. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-045.md +0 -0
  199. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-046.md +0 -0
  200. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-047.md +0 -0
  201. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-048.md +0 -0
  202. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-049.md +0 -0
  203. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-050.md +0 -0
  204. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-051.md +0 -0
  205. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-052.md +0 -0
  206. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-053.md +0 -0
  207. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-054.md +0 -0
  208. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-055.md +0 -0
  209. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-056.md +0 -0
  210. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-057.md +0 -0
  211. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-058.md +0 -0
  212. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-059.md +0 -0
  213. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-060.md +0 -0
  214. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-063.md +0 -0
  215. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-066.md +0 -0
  216. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-067.md +0 -0
  217. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-068.md +0 -0
  218. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-069.md +0 -0
  219. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-070.md +0 -0
  220. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-071.md +0 -0
  221. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-072.md +0 -0
  222. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-073.md +0 -0
  223. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-074.md +0 -0
  224. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-075.md +0 -0
  225. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-076.md +0 -0
  226. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-077.md +0 -0
  227. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-078.md +0 -0
  228. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-079.md +0 -0
  229. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-080.md +0 -0
  230. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-081.md +0 -0
  231. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-082.md +0 -0
  232. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-083.md +0 -0
  233. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-084.md +0 -0
  234. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-086.md +0 -0
  235. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-088.md +0 -0
  236. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-089.md +0 -0
  237. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-090.md +0 -0
  238. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-091.md +0 -0
  239. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-092.md +0 -0
  240. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-093.md +0 -0
  241. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-094.md +0 -0
  242. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-095.md +0 -0
  243. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-097.md +0 -0
  244. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-098.md +0 -0
  245. {pactkit-2.10.3 → pactkit-2.10.4}/docs/specs/STORY-slim-099.md +0 -0
  246. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/BUG-001_case.md +0 -0
  247. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/BUG-002_case.md +0 -0
  248. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/STORY-slim-028_case.md +0 -0
  249. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/STORY-slim-029_case.md +0 -0
  250. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/STORY-slim-031_case.md +0 -0
  251. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/STORY-slim-032_case.md +0 -0
  252. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/STORY-slim-033_case.md +0 -0
  253. {pactkit-2.10.3 → pactkit-2.10.4}/docs/test_cases/STORY-slim-034_case.md +0 -0
  254. {pactkit-2.10.3 → pactkit-2.10.4}/opencode.json +0 -0
  255. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/__main__.py +0 -0
  256. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/audit.py +0 -0
  257. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/backfill.py +0 -0
  258. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/cleaners.py +0 -0
  259. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/cli.py +0 -0
  260. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/config.py +0 -0
  261. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/context_gen.py +0 -0
  262. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/coverage_gate.py +0 -0
  263. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/doctor.py +0 -0
  264. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/garden.py +0 -0
  265. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/generators/__init__.py +0 -0
  266. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/generators/adapter.py +0 -0
  267. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/generators/deploy_base.py +0 -0
  268. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/generators/deployer.py +0 -0
  269. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/guards.py +0 -0
  270. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/id_generator.py +0 -0
  271. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/invariants.py +0 -0
  272. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/issue_sync.py +0 -0
  273. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/lazy_visualize.py +0 -0
  274. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/lessons.py +0 -0
  275. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/lint_runner.py +0 -0
  276. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/observe.py +0 -0
  277. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/profiles.py +0 -0
  278. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/prompts/__init__.py +0 -0
  279. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/prompts/agents.py +0 -0
  280. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/prompts/commands.py +0 -0
  281. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/prompts/references.py +0 -0
  282. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/prompts/rules.py +0 -0
  283. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/prompts/skills.py +0 -0
  284. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/regression.py +0 -0
  285. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/schemas.py +0 -0
  286. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/scripts.py +0 -0
  287. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/sec_scope.py +0 -0
  288. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/__init__.py +0 -0
  289. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/analyzers/__init__.py +0 -0
  290. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  291. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  292. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  293. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  294. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/board.py +0 -0
  295. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/report.py +0 -0
  296. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/scaffold.py +0 -0
  297. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/spec_linter.py +0 -0
  298. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/skills/visualize.py +0 -0
  299. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/spec_status.py +0 -0
  300. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/test_mapper.py +0 -0
  301. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/utils.py +0 -0
  302. {pactkit-2.10.3 → pactkit-2.10.4}/src/pactkit/validators.py +0 -0
  303. {pactkit-2.10.3 → pactkit-2.10.4}/tests/conftest.py +0 -0
  304. {pactkit-2.10.3 → pactkit-2.10.4}/tests/e2e/__init__.py +0 -0
  305. {pactkit-2.10.3 → pactkit-2.10.4}/tests/e2e/cli/__init__.py +0 -0
  306. {pactkit-2.10.3 → pactkit-2.10.4}/tests/e2e/cli/test_cli_e2e.py +0 -0
  307. {pactkit-2.10.3 → pactkit-2.10.4}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  308. {pactkit-2.10.3 → pactkit-2.10.4}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  309. {pactkit-2.10.3 → pactkit-2.10.4}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  310. {pactkit-2.10.3 → pactkit-2.10.4}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  311. {pactkit-2.10.3 → pactkit-2.10.4}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  312. {pactkit-2.10.3 → pactkit-2.10.4}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  313. {pactkit-2.10.3 → pactkit-2.10.4}/tests/fixtures/api_call_parser/page.tsx +0 -0
  314. {pactkit-2.10.3 → pactkit-2.10.4}/tests/integration/__init__.py +0 -0
  315. {pactkit-2.10.3 → pactkit-2.10.4}/tests/integration/test_deploy_classic.py +0 -0
  316. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_agent_features.py +0 -0
  317. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_agent_frontmatter.py +0 -0
  318. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_agents_enrichment.py +0 -0
  319. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_audit.py +0 -0
  320. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_blast_radius.py +0 -0
  321. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_board_bug027.py +0 -0
  322. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_board_sections.py +0 -0
  323. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug001_skill_path.py +0 -0
  324. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug002_plugin_paths.py +0 -0
  325. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug003_multi_import.py +0 -0
  326. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug004_dead_set.py +0 -0
  327. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug005_archive_taskless.py +0 -0
  328. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug006_scan_excludes.py +0 -0
  329. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  330. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  331. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  332. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  333. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug011_stale_refs.py +0 -0
  334. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  335. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug013_config_single_source.py +0 -0
  336. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug014_version_hygiene.py +0 -0
  337. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  338. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  339. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug019_venv_deployment.py +0 -0
  340. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  341. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug025_release_delegation.py +0 -0
  342. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug026_version_sync.py +0 -0
  343. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug028_ghost_refs.py +0 -0
  344. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  345. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  346. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  347. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  348. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_021.py +0 -0
  349. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_022.py +0 -0
  350. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_023.py +0 -0
  351. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_024.py +0 -0
  352. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  353. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  354. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_slim003.py +0 -0
  355. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_slim004.py +0 -0
  356. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_slim005.py +0 -0
  357. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_slim006.py +0 -0
  358. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  359. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_check_command.py +0 -0
  360. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_check_extensions_072_073.py +0 -0
  361. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_check_playbook_072_073.py +0 -0
  362. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_command_frontmatter.py +0 -0
  363. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_command_visualize_modes.py +0 -0
  364. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_complexity.py +0 -0
  365. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_config.py +0 -0
  366. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_config_auto_merge.py +0 -0
  367. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_constitution_sharpening.py +0 -0
  368. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_context_gen.py +0 -0
  369. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_create_skill.py +0 -0
  370. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_cross_flow_matrix.py +0 -0
  371. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_deploy_base.py +0 -0
  372. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_deployer_cleanup.py +0 -0
  373. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_deployer_plugin.py +0 -0
  374. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_design_command.py +0 -0
  375. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_done_gates.py +0 -0
  376. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_draw_prompt.py +0 -0
  377. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_draw_references.py +0 -0
  378. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_drawio_mcp.py +0 -0
  379. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_garden.py +0 -0
  380. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_home_path_fix.py +0 -0
  381. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_init_guard.py +0 -0
  382. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_init_playbook_074.py +0 -0
  383. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_lang_profiles.py +0 -0
  384. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_layer_violations.py +0 -0
  385. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_lessons_rotation_075.py +0 -0
  386. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_list_stories.py +0 -0
  387. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_mcp_integration.py +0 -0
  388. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_model_config.py +0 -0
  389. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_modular_constitution.py +0 -0
  390. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_monorepo_detect.py +0 -0
  391. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_multi_prefix.py +0 -0
  392. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_observe.py +0 -0
  393. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_pdca_slim.py +0 -0
  394. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_profiles.py +0 -0
  395. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_project_visibility.py +0 -0
  396. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_prompt_cli_refs.py +0 -0
  397. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_prompt_quality_075.py +0 -0
  398. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_prompt_structural_invariants.py +0 -0
  399. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_prompts_package.py +0 -0
  400. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_release.py +0 -0
  401. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_release_field.py +0 -0
  402. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_release_v110.py +0 -0
  403. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_render_prompt.py +0 -0
  404. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_report_parser.py +0 -0
  405. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_report_unified.py +0 -0
  406. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_review_command.py +0 -0
  407. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_rules_enrichment.py +0 -0
  408. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_scaffold.py +0 -0
  409. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  410. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_schemas.py +0 -0
  411. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_script_extraction.py +0 -0
  412. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_selective_deploy.py +0 -0
  413. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_session_context.py +0 -0
  414. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_skill_structure.py +0 -0
  415. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_skills_enrichment.py +0 -0
  416. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_slim_deps_088.py +0 -0
  417. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_smart_regression.py +0 -0
  418. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_sprint_command.py +0 -0
  419. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_stack_references.py +0 -0
  420. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_status_command.py +0 -0
  421. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_statusline.py +0 -0
  422. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story014_release.py +0 -0
  423. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  424. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story016_claude_md.py +0 -0
  425. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story017_init_claude_md.py +0 -0
  426. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story018_arch_staleness.py +0 -0
  427. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story019_bailout.py +0 -0
  428. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story020_horizon.py +0 -0
  429. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story021_rfc.py +0 -0
  430. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story022_decision_tree.py +0 -0
  431. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story023_test_quality.py +0 -0
  432. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story024_native_agent.py +0 -0
  433. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story025_ci_pipeline.py +0 -0
  434. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story026_issue_tracker.py +0 -0
  435. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story027_hooks.py +0 -0
  436. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story028_rule_scoping.py +0 -0
  437. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story029_doctor.py +0 -0
  438. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story030_lint.py +0 -0
  439. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story031_git_init_guard.py +0 -0
  440. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  441. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story033_config_backfill.py +0 -0
  442. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  443. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story035_readme_docs.py +0 -0
  444. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story037_regression_fix.py +0 -0
  445. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story038_call_graph_update.py +0 -0
  446. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story039_venv_config.py +0 -0
  447. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story040_layered_claude_md.py +0 -0
  448. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story042_spec_linter.py +0 -0
  449. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story043_active_clarify.py +0 -0
  450. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story044_consistency_check.py +0 -0
  451. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story045_auto_pr.py +0 -0
  452. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story046_agent_adapter.py +0 -0
  453. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story047_enterprise_flags.py +0 -0
  454. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story048_worktree_isolation.py +0 -0
  455. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story049_community_standards.py +0 -0
  456. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  457. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  458. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story052_conditional_github_release.py +0 -0
  459. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story053_impact_regression.py +0 -0
  460. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story055_commands.py +0 -0
  461. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story055_config.py +0 -0
  462. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story055_spec_linter.py +0 -0
  463. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story056_commands.py +0 -0
  464. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story056_config.py +0 -0
  465. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  466. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story058_opencode_extraction.py +0 -0
  467. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story058_routing_fix.py +0 -0
  468. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story059_codex_removal.py +0 -0
  469. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story060_init_hang.py +0 -0
  470. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story061_remove_thinking.py +0 -0
  471. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  472. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story064_venv_local_md.py +0 -0
  473. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story065_sprint_model.py +0 -0
  474. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story072_developer_prefix.py +0 -0
  475. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  476. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  477. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim011_command_rules.py +0 -0
  478. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim012_ci.py +0 -0
  479. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_clean.py +0 -0
  480. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_context.py +0 -0
  481. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_guard.py +0 -0
  482. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  483. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_next_id.py +0 -0
  484. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_regression.py +0 -0
  485. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  486. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim014_validators.py +0 -0
  487. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim015_doctor.py +0 -0
  488. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  489. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim017.py +0 -0
  490. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim018.py +0 -0
  491. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  492. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  493. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim021.py +0 -0
  494. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim022.py +0 -0
  495. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim023.py +0 -0
  496. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim024.py +0 -0
  497. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim025.py +0 -0
  498. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim026.py +0 -0
  499. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim027.py +0 -0
  500. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim028.py +0 -0
  501. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim029.py +0 -0
  502. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim030.py +0 -0
  503. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim031.py +0 -0
  504. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim032.py +0 -0
  505. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim033.py +0 -0
  506. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim034.py +0 -0
  507. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim035.py +0 -0
  508. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim036.py +0 -0
  509. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim037.py +0 -0
  510. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim038.py +0 -0
  511. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim039.py +0 -0
  512. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim040.py +0 -0
  513. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim041.py +0 -0
  514. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim042.py +0 -0
  515. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim043.py +0 -0
  516. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim044.py +0 -0
  517. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim045.py +0 -0
  518. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim046.py +0 -0
  519. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim047.py +0 -0
  520. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim048.py +0 -0
  521. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim049.py +0 -0
  522. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim051.py +0 -0
  523. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim052.py +0 -0
  524. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim053.py +0 -0
  525. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim054.py +0 -0
  526. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim055.py +0 -0
  527. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim056.py +0 -0
  528. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  529. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim063.py +0 -0
  530. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim065.py +0 -0
  531. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim076_multistack.py +0 -0
  532. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  533. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim078.py +0 -0
  534. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim079.py +0 -0
  535. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim080.py +0 -0
  536. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim081.py +0 -0
  537. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim082.py +0 -0
  538. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim083.py +0 -0
  539. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim084.py +0 -0
  540. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim095.py +0 -0
  541. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  542. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  543. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_tools.py +0 -0
  544. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_topology_parsers_066.py +0 -0
  545. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_update_task.py +0 -0
  546. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_visualize_call_nested.py +0 -0
  547. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_visualize_chain_fix.py +0 -0
  548. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_visualize_modes.py +0 -0
  549. {pactkit-2.10.3 → pactkit-2.10.4}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -2,7 +2,7 @@
2
2
  # Edit this file to customize which components are deployed.
3
3
  # Remove items from a list to disable them. Default: all enabled.
4
4
 
5
- version: "2.10.3"
5
+ version: "2.10.4"
6
6
  stack: python
7
7
  root: .
8
8
  developer: "slim"
@@ -4,6 +4,11 @@ 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.4] - 2026-04-20
8
+
9
+ ### Added
10
+ - **Hotfix Impact Check** (STORY-slim-100) — `/project-hotfix` now includes Phase 0.5 that reads existing `.mmd` call graph files before fixing. Warns when target function has 3+ callers. Advisory (L3), non-blocking, gracefully skips when no graphs exist.
11
+
7
12
  ## [2.10.3] - 2026-04-20
8
13
 
9
14
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.10.3
3
+ Version: 2.10.4
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
@@ -47,3 +47,4 @@
47
47
  | 2026-03-24 | spec_linter.py _check_acceptance_criteria: per-subsection GWT check must use raw_text (with code blocks) not stripped text, because specs legitimately wrap Gherkin in fenced blocks | spec_linter.py:_check_acceptance_criteria |
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
+ | 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 |
@@ -2,7 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 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 |
6
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 |
7
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 |
8
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 |
@@ -53,3 +52,4 @@
53
52
  | 2026-04-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 | guards.py:check_version_mismatch |
54
53
  | 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 |
55
54
  | 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
+ | 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 |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3755+ tests must pass before any commit to `main`.
18
+ 1. All 3762+ 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`.
@@ -205,3 +205,10 @@
205
205
  - [x] Update Shared Protocols Referenced-by line
206
206
  - [x] Redeploy via pactkit update
207
207
  - [x] Verify deployed plugin sync
208
+
209
+ ### [STORY-slim-100] Hotfix impact check via .mmd call graph
210
+ > Spec: docs/specs/STORY-slim-100.md
211
+
212
+ - [x] Add Phase 0.5 Impact Check to HOTFIX_PROMPT
213
+ - [x] Add tests for new phase
214
+ - [x] Deploy verification
@@ -1,5 +1,5 @@
1
1
  # Project Context (Auto-generated)
2
- > Last updated: 2026-04-20T15:24:48+08:00 by pactkit context
2
+ > Last updated: 2026-04-20T17:32:07+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-dimension audit (config+code 50/50) gives accurate project health picture; scanning ~/.claude/ global config catches harness setup invisible at project level
19
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.
20
19
  - 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
21
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
22
21
  - pactkit clean rglob patterns must exclude protected parent dirs (node_modules, .git) — recursive pattern matching deletes dependency internals
22
+ - 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.
23
23
 
24
24
  ## Next Recommended Action
25
25
  `/project-design`
@@ -0,0 +1,87 @@
1
+ # STORY-slim-100: Hotfix impact check via .mmd call graph
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-100 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.10.4 |
9
+
10
+ ## Background
11
+
12
+ The `/project-hotfix` playbook locates target code via `Grep`/`Glob` (Phase 0) and immediately proceeds to fix (Phase 1) without consulting the project's `.mmd` call graph files. This means "No Side Effects" (Phase 1.3) is enforced purely by AI judgment, not data. In contrast, `/project-act` uses `pactkit-trace` (Phase 1) and `code_graph.mmd` importer counts (Phase 3) to detect high-fan-in functions before modifying them. A hotfix that changes a function with 5+ callers can silently break upstream consumers.
13
+
14
+ ## Requirements
15
+
16
+ ### R1: Lightweight Impact Check Phase (MUST)
17
+
18
+ Insert a new **Phase 0.5: Impact Check** between Phase 0 (Locate & Register) and Phase 1 (Fix) in the `HOTFIX_PROMPT`. This phase reads existing `.mmd` call graph files (`call_graph.mmd`, `reverse_call_graph.mmd`, or `code_graph.mmd`) to identify callers of the target function/file.
19
+
20
+ ### R2: High-Fan-In Warning (SHOULD)
21
+
22
+ If the target function/file has **3+ callers** in the call graph, the playbook SHOULD warn the user about potential impact scope and suggest considering `/project-act` for the full PDCA workflow.
23
+
24
+ ### R3: Graceful Degradation (MUST)
25
+
26
+ If `.mmd` files do not exist in `docs/architecture/graphs/`, the impact check MUST skip silently with a log message ("No call graph available — skipping impact check"). This preserves hotfix's lightweight nature for projects without visualize data.
27
+
28
+ ### R4: Non-Blocking (MUST)
29
+
30
+ The impact check MUST NOT block the hotfix workflow — it is advisory only (L3 signal). The user can acknowledge the warning and proceed.
31
+
32
+ ## Acceptance Criteria
33
+
34
+ ### AC1: Impact Check Phase Exists in Prompt (R1)
35
+
36
+ - **Given** the `HOTFIX_PROMPT` string in `workflows.py`
37
+ - **When** the prompt text is inspected
38
+ - **Then** it contains "Phase 0.5" and "Impact Check" and references `.mmd` call graph files
39
+
40
+ ### AC2: High-Fan-In Warning Text Present (R2)
41
+
42
+ - **Given** the `HOTFIX_PROMPT` string
43
+ - **When** the prompt text is inspected
44
+ - **Then** it contains a threshold (e.g., "3+ callers") and a suggestion to consider `/project-act`
45
+
46
+ ### AC3: Graceful Skip When No Graphs (R3)
47
+
48
+ - **Given** the `HOTFIX_PROMPT` string
49
+ - **When** the prompt text is inspected
50
+ - **Then** it contains instructions to skip silently if `.mmd` files do not exist
51
+
52
+ ### AC4: Non-Blocking Advisory Signal (R4)
53
+
54
+ - **Given** the `HOTFIX_PROMPT` string
55
+ - **When** the prompt text is inspected
56
+ - **Then** the impact check is described as advisory (not a gate), and the phase does not use "MUST STOP" or blocking language
57
+
58
+ ## Target Call Chain
59
+
60
+ `HOTFIX_PROMPT` (workflows.py:543) → imported by `commands.py:3` → registered in `COMMANDS_CONTENT["project-hotfix.md"]` (commands.py:750) → deployed by `deployer.py` via `_render_prompt()` → output to `pactkit-plugin/commands/project-hotfix.md` and `.github/prompts/project-hotfix.prompt.md`
61
+
62
+ ## Implementation Steps
63
+
64
+ | Step | File | Action | Dependencies | Risk |
65
+ |------|------|--------|-------------|------|
66
+ | 1 | `src/pactkit/prompts/workflows.py` | Add Phase 0.5 Impact Check text to `HOTFIX_PROMPT` between Phase 0 and Phase 1 | None | Low |
67
+ | 2 | `tests/unit/test_hotfix_command.py` | Add test class verifying Phase 0.5 keywords exist in prompt | Step 1 | Low |
68
+ | 3 | Deploy verification | Run `pactkit deploy` and verify `pactkit-plugin/commands/project-hotfix.md` contains the new phase | Step 1 | Low |
69
+
70
+ ## Security Scope
71
+
72
+ | Check | Applicable | Reason |
73
+ |-------|------------|--------|
74
+ | SEC-1 | N/A | Prompt text only, no executable injection surface |
75
+ | SEC-2 | N/A | No user input processing — playbook instruction text |
76
+ | SEC-3 | N/A | No database patterns |
77
+ | SEC-4 | N/A | No frontend files |
78
+ | SEC-5 | N/A | No auth/session handling — false positive on keyword match |
79
+ | SEC-6 | N/A | No API/route files |
80
+ | SEC-7 | N/A | No error handling patterns |
81
+ | SEC-8 | N/A | No dependency manifests |
82
+
83
+ ## Out of Scope
84
+
85
+ - Full `pactkit-trace` integration (too heavy for hotfix; Act already handles it)
86
+ - Updating `code_graph.mmd` or `call_graph.mmd` during hotfix (hotfix is read-only on graphs)
87
+ - Blocking hotfix workflow based on impact check results
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pactkit"
7
- version = "2.10.3"
7
+ version = "2.10.4"
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.3"
3
+ __version__ = "2.10.4"
@@ -573,6 +573,16 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
573
573
  6. **Add Board Entry**: Add the hotfix to the Board:
574
574
  - `{BOARD_CMD} add_story HOTFIX-{NNN} "Short title" "Fix description"`
575
575
 
576
+ ## 🔍 Phase 0.5: Impact Check (Lightweight)
577
+ > **PURPOSE**: Data-driven side-effect awareness — read existing call graphs to surface upstream callers before modifying code. This is advisory (L3 SHOULD), non-blocking.
578
+ 1. **Check Graph Availability**: Look for `docs/architecture/graphs/call_graph.mmd` or `docs/architecture/graphs/reverse_call_graph.mmd` or `docs/architecture/graphs/code_graph.mmd`.
579
+ - If none exist: log "No call graph available — skipping impact check" and proceed to Phase 1.
580
+ 2. **Identify Callers**: Search the available `.mmd` file for the target function/file identified in Phase 0. Count how many other nodes reference it (callers/importers).
581
+ 3. **High-Fan-In Warning**: If the target has **3+ callers**, SHOULD warn the user:
582
+ > "⚠️ Target has {N} callers in the call graph. Changes may affect upstream consumers. Consider `/project-act` for full impact analysis."
583
+ - This warning is advisory — the user can acknowledge and proceed.
584
+ 4. **Proceed**: Continue to Phase 1 regardless of findings.
585
+
576
586
  ## 🔧 Phase 1: Fix
577
587
  1. **Fix**: Use `Edit` or `Write` to directly fix the target code.
578
588
  2. **Scope**: Keep the modification scope as small as possible — only change what must be changed, no extra optimization or refactoring.
@@ -138,6 +138,43 @@ class TestBackwardCompatibility:
138
138
  assert agent in p.AGENTS_EXPERT, f"Missing agent {agent}"
139
139
 
140
140
 
141
+ class TestImpactCheckPhase:
142
+ """Scenario 8: Phase 0.5 Impact Check exists (STORY-slim-100)"""
143
+
144
+ def test_has_phase_05(self):
145
+ p = _prompts()
146
+ assert 'Phase 0.5' in p.HOTFIX_PROMPT
147
+
148
+ def test_has_impact_check_title(self):
149
+ p = _prompts()
150
+ assert 'Impact Check' in p.HOTFIX_PROMPT
151
+
152
+ def test_references_mmd_files(self):
153
+ p = _prompts()
154
+ text = p.HOTFIX_PROMPT
155
+ assert 'call_graph.mmd' in text or 'reverse_call_graph.mmd' in text or 'code_graph.mmd' in text
156
+
157
+ def test_has_fan_in_threshold(self):
158
+ p = _prompts()
159
+ assert '3+' in p.HOTFIX_PROMPT or '3 or more' in p.HOTFIX_PROMPT
160
+
161
+ def test_suggests_project_act(self):
162
+ p = _prompts()
163
+ assert '/project-act' in p.HOTFIX_PROMPT
164
+
165
+ def test_graceful_skip_when_no_graphs(self):
166
+ p = _prompts()
167
+ text = p.HOTFIX_PROMPT.lower()
168
+ assert 'skip' in text and ('no call graph' in text or 'do not exist' in text or 'not exist' in text)
169
+
170
+ def test_non_blocking_advisory(self):
171
+ """Impact check must not use blocking language."""
172
+ p = _prompts()
173
+ text = p.HOTFIX_PROMPT
174
+ assert 'MUST STOP' not in text or text.index('Phase 0.5') > text.index('MUST STOP')
175
+ assert 'advisory' in text.lower() or 'non-blocking' in text.lower() or 'SHOULD' in text
176
+
177
+
141
178
  class TestDeployment:
142
179
  """Scenario 7: 部署后文件存在"""
143
180
 
@@ -203,7 +203,8 @@ class TestAC6DevRefGhostResolved:
203
203
  # STORY-slim-072/073: bumped +2489 for Check Phase 4.5/4.7 (PactGuard + Observe)
204
204
  # STORY-slim-091: bumped +248 for Done Phase 3.8 harness audit refresh
205
205
  # audit --if-needed in Done playbook
206
- BASELINE_TOTAL_CHARS = 79143
206
+ # STORY-slim-100: bumped +1212 for Hotfix Phase 0.5 Impact Check
207
+ BASELINE_TOTAL_CHARS = 80355
207
208
 
208
209
 
209
210
  class TestAC7PromptSizeReduced:
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes