pactkit 2.15.0__tar.gz → 2.15.2__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 (612) hide show
  1. pactkit-2.15.2/.codegraph/.gitignore +5 -0
  2. {pactkit-2.15.0 → pactkit-2.15.2}/CHANGELOG.md +23 -0
  3. {pactkit-2.15.0 → pactkit-2.15.2}/PKG-INFO +1 -1
  4. {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/archive/lessons_archive_202603.md +3 -0
  5. {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/lessons.md +3 -3
  6. {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/rules.md +1 -1
  7. pactkit-2.15.2/docs/product/archive/archive_202606.md +37 -0
  8. pactkit-2.15.2/docs/product/archive/archive_202607.md +13 -0
  9. pactkit-2.15.2/docs/product/context.md +29 -0
  10. {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/sprint_board.md +11 -0
  11. pactkit-2.15.2/docs/specs/HOTFIX-slim-130.md +104 -0
  12. pactkit-2.15.2/docs/specs/HOTFIX-slim-131.md +21 -0
  13. pactkit-2.15.2/docs/specs/HOTFIX-slim-132.md +23 -0
  14. pactkit-2.15.2/docs/specs/STORY-slim-128.md +157 -0
  15. pactkit-2.15.2/docs/specs/STORY-slim-129.md +134 -0
  16. pactkit-2.15.2/docs/specs/STORY-slim-132.md +96 -0
  17. {pactkit-2.15.0 → pactkit-2.15.2}/pyproject.toml +1 -1
  18. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/__init__.py +1 -1
  19. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/config.py +1 -0
  20. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/deploy_base.py +6 -0
  21. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/deployer.py +47 -8
  22. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/commands.py +21 -5
  23. pactkit-2.15.2/src/pactkit/prompts/guides.py +657 -0
  24. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/rules.py +72 -6
  25. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/skills.py +2 -9
  26. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/schemas.py +2 -1
  27. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/spec_linter.py +1 -1
  28. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_config.py +2 -2
  29. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompt_structural_invariants.py +2 -2
  30. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_selective_deploy.py +2 -2
  31. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_solution_design_rule.py +9 -7
  32. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story042_spec_linter.py +42 -0
  33. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story059_codex_removal.py +1 -1
  34. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story063_prompt_slimming.py +3 -1
  35. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim011_command_rules.py +13 -10
  36. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim021.py +3 -3
  37. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim026.py +2 -2
  38. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim112_rules_split.py +8 -7
  39. pactkit-2.15.2/tests/unit/test_story_slim128_engineering_concerns.py +207 -0
  40. pactkit-2.15.2/tests/unit/test_story_slim132.py +146 -0
  41. pactkit-2.15.0/.codegraph/.gitignore +0 -16
  42. pactkit-2.15.0/docs/product/archive/archive_202606.md +0 -17
  43. pactkit-2.15.0/docs/product/context.md +0 -29
  44. {pactkit-2.15.0 → pactkit-2.15.2}/.github/workflows/pactkit.yml +0 -0
  45. {pactkit-2.15.0 → pactkit-2.15.2}/.github/workflows/publish.yml +0 -0
  46. {pactkit-2.15.0 → pactkit-2.15.2}/.gitignore +0 -0
  47. {pactkit-2.15.0 → pactkit-2.15.2}/AGENTS.md +0 -0
  48. {pactkit-2.15.0 → pactkit-2.15.2}/CODE_OF_CONDUCT.md +0 -0
  49. {pactkit-2.15.0 → pactkit-2.15.2}/CONTRIBUTING.md +0 -0
  50. {pactkit-2.15.0 → pactkit-2.15.2}/LICENSE +0 -0
  51. {pactkit-2.15.0 → pactkit-2.15.2}/README.md +0 -0
  52. {pactkit-2.15.0 → pactkit-2.15.2}/SECURITY.md +0 -0
  53. {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  54. {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/harness_audit.json +0 -0
  55. {pactkit-2.15.0 → pactkit-2.15.2}/docs/architecture/governance/philosophy.md +0 -0
  56. {pactkit-2.15.0 → pactkit-2.15.2}/docs/assets/logo.png +0 -0
  57. {pactkit-2.15.0 → pactkit-2.15.2}/docs/e2e/journey.md +0 -0
  58. {pactkit-2.15.0 → pactkit-2.15.2}/docs/guides/codex-integration-preresearch.md +0 -0
  59. {pactkit-2.15.0 → pactkit-2.15.2}/docs/guides/tool-integration-checklist.md +0 -0
  60. {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202602.md +0 -0
  61. {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202603.md +0 -0
  62. {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202604.md +0 -0
  63. {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/archive/archive_202605.md +0 -0
  64. {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/friction-log.md +0 -0
  65. {pactkit-2.15.0 → pactkit-2.15.2}/docs/product/prd.md +0 -0
  66. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-001.md +0 -0
  67. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-002.md +0 -0
  68. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-003.md +0 -0
  69. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-004.md +0 -0
  70. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-005.md +0 -0
  71. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-006.md +0 -0
  72. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-007.md +0 -0
  73. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-008.md +0 -0
  74. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-009.md +0 -0
  75. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-010.md +0 -0
  76. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-011.md +0 -0
  77. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-012.md +0 -0
  78. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-013.md +0 -0
  79. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-014.md +0 -0
  80. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-015.md +0 -0
  81. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-016.md +0 -0
  82. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-017.md +0 -0
  83. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-018.md +0 -0
  84. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-019.md +0 -0
  85. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-020.md +0 -0
  86. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-021.md +0 -0
  87. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-022.md +0 -0
  88. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-023.md +0 -0
  89. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-024.md +0 -0
  90. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-025.md +0 -0
  91. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-026.md +0 -0
  92. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-027.md +0 -0
  93. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-028.md +0 -0
  94. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-029.md +0 -0
  95. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-030.md +0 -0
  96. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-031.md +0 -0
  97. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-032.md +0 -0
  98. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-033.md +0 -0
  99. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-034.md +0 -0
  100. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-035.md +0 -0
  101. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-001.md +0 -0
  102. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-002.md +0 -0
  103. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-003.md +0 -0
  104. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-004.md +0 -0
  105. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-005.md +0 -0
  106. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-006.md +0 -0
  107. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-089.md +0 -0
  108. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/BUG-slim-107.md +0 -0
  109. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-023.md +0 -0
  110. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-049.md +0 -0
  111. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-050.md +0 -0
  112. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-051.md +0 -0
  113. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-052.md +0 -0
  114. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-061.md +0 -0
  115. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-062.md +0 -0
  116. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-067.md +0 -0
  117. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-069.md +0 -0
  118. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-070.md +0 -0
  119. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-085.md +0 -0
  120. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-087.md +0 -0
  121. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-096.md +0 -0
  122. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-099.md +0 -0
  123. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-107.md +0 -0
  124. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-117.md +0 -0
  125. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-122.md +0 -0
  126. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-123.md +0 -0
  127. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-126.md +0 -0
  128. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/HOTFIX-slim-127.md +0 -0
  129. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-001.md +0 -0
  130. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-002.md +0 -0
  131. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-003.md +0 -0
  132. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-004.md +0 -0
  133. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-005.md +0 -0
  134. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-006.md +0 -0
  135. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-007.md +0 -0
  136. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-008.md +0 -0
  137. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-009.md +0 -0
  138. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-010.md +0 -0
  139. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-011.md +0 -0
  140. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-012.md +0 -0
  141. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-013.md +0 -0
  142. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-014.md +0 -0
  143. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-015.md +0 -0
  144. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-016.md +0 -0
  145. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-017.md +0 -0
  146. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-018.md +0 -0
  147. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-019.md +0 -0
  148. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-020.md +0 -0
  149. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-021.md +0 -0
  150. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-022.md +0 -0
  151. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-023.md +0 -0
  152. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-024.md +0 -0
  153. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-025.md +0 -0
  154. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-026.md +0 -0
  155. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-027.md +0 -0
  156. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-028.md +0 -0
  157. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-029.md +0 -0
  158. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-030.md +0 -0
  159. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-031.md +0 -0
  160. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-032.md +0 -0
  161. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-033.md +0 -0
  162. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-034.md +0 -0
  163. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-035.md +0 -0
  164. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-036.md +0 -0
  165. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-037.md +0 -0
  166. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-038.md +0 -0
  167. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-039.md +0 -0
  168. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-040.md +0 -0
  169. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-041.md +0 -0
  170. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-042.md +0 -0
  171. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-043.md +0 -0
  172. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-044.md +0 -0
  173. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-045.md +0 -0
  174. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-046.md +0 -0
  175. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-047.md +0 -0
  176. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-048.md +0 -0
  177. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-049.md +0 -0
  178. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-050.md +0 -0
  179. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-051.md +0 -0
  180. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-052.md +0 -0
  181. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-053.md +0 -0
  182. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-054.md +0 -0
  183. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-055.md +0 -0
  184. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-056.md +0 -0
  185. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-057.md +0 -0
  186. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-058.md +0 -0
  187. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-059.md +0 -0
  188. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-060.md +0 -0
  189. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-061.md +0 -0
  190. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-062.md +0 -0
  191. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-063.md +0 -0
  192. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-064.md +0 -0
  193. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-065.md +0 -0
  194. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-069.md +0 -0
  195. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-070.md +0 -0
  196. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-071.md +0 -0
  197. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-072.md +0 -0
  198. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-073.md +0 -0
  199. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-001.md +0 -0
  200. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-005.md +0 -0
  201. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-006.md +0 -0
  202. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-007.md +0 -0
  203. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-009.md +0 -0
  204. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-010.md +0 -0
  205. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-011.md +0 -0
  206. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-012.md +0 -0
  207. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-013.md +0 -0
  208. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-014.md +0 -0
  209. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-015.md +0 -0
  210. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-016.md +0 -0
  211. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-017.md +0 -0
  212. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-018.md +0 -0
  213. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-019.md +0 -0
  214. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-020.md +0 -0
  215. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-021.md +0 -0
  216. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-022.md +0 -0
  217. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-023.md +0 -0
  218. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-024.md +0 -0
  219. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-028.md +0 -0
  220. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-029.md +0 -0
  221. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-030.md +0 -0
  222. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-031.md +0 -0
  223. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-032.md +0 -0
  224. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-033.md +0 -0
  225. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-034.md +0 -0
  226. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-035.md +0 -0
  227. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-036.md +0 -0
  228. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-037.md +0 -0
  229. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-038.md +0 -0
  230. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-039.md +0 -0
  231. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-040.md +0 -0
  232. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-041.md +0 -0
  233. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-042.md +0 -0
  234. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-043.md +0 -0
  235. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-044.md +0 -0
  236. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-045.md +0 -0
  237. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-046.md +0 -0
  238. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-047.md +0 -0
  239. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-048.md +0 -0
  240. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-049.md +0 -0
  241. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-050.md +0 -0
  242. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-051.md +0 -0
  243. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-052.md +0 -0
  244. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-053.md +0 -0
  245. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-054.md +0 -0
  246. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-055.md +0 -0
  247. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-056.md +0 -0
  248. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-057.md +0 -0
  249. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-058.md +0 -0
  250. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-059.md +0 -0
  251. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-060.md +0 -0
  252. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-063.md +0 -0
  253. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-066.md +0 -0
  254. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-067.md +0 -0
  255. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-068.md +0 -0
  256. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-069.md +0 -0
  257. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-070.md +0 -0
  258. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-071.md +0 -0
  259. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-072.md +0 -0
  260. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-073.md +0 -0
  261. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-074.md +0 -0
  262. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-075.md +0 -0
  263. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-076.md +0 -0
  264. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-077.md +0 -0
  265. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-078.md +0 -0
  266. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-079.md +0 -0
  267. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-080.md +0 -0
  268. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-081.md +0 -0
  269. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-082.md +0 -0
  270. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-083.md +0 -0
  271. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-084.md +0 -0
  272. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-086.md +0 -0
  273. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-088.md +0 -0
  274. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-089.md +0 -0
  275. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-090.md +0 -0
  276. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-091.md +0 -0
  277. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-092.md +0 -0
  278. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-093.md +0 -0
  279. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-094.md +0 -0
  280. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-095.md +0 -0
  281. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-097.md +0 -0
  282. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-098.md +0 -0
  283. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-099.md +0 -0
  284. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-100.md +0 -0
  285. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-101.md +0 -0
  286. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-102.md +0 -0
  287. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-103.md +0 -0
  288. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-104.md +0 -0
  289. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-105.md +0 -0
  290. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-106.md +0 -0
  291. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-107.md +0 -0
  292. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-108.md +0 -0
  293. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-109.md +0 -0
  294. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-110.md +0 -0
  295. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-111.md +0 -0
  296. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-112.md +0 -0
  297. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-113.md +0 -0
  298. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-114.md +0 -0
  299. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-115.md +0 -0
  300. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-116.md +0 -0
  301. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-118.md +0 -0
  302. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-119.md +0 -0
  303. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-120.md +0 -0
  304. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-121.md +0 -0
  305. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-124.md +0 -0
  306. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-125.md +0 -0
  307. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-126.md +0 -0
  308. {pactkit-2.15.0 → pactkit-2.15.2}/docs/specs/STORY-slim-127.md +0 -0
  309. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/BUG-001_case.md +0 -0
  310. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/BUG-002_case.md +0 -0
  311. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-028_case.md +0 -0
  312. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-029_case.md +0 -0
  313. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-031_case.md +0 -0
  314. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-032_case.md +0 -0
  315. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-033_case.md +0 -0
  316. {pactkit-2.15.0 → pactkit-2.15.2}/docs/test_cases/STORY-slim-034_case.md +0 -0
  317. {pactkit-2.15.0 → pactkit-2.15.2}/opencode.json +0 -0
  318. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/__main__.py +0 -0
  319. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/audit.py +0 -0
  320. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/backfill.py +0 -0
  321. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/cleaners.py +0 -0
  322. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/cli.py +0 -0
  323. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/context_gen.py +0 -0
  324. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/coverage_gate.py +0 -0
  325. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/doctor.py +0 -0
  326. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/garden.py +0 -0
  327. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/__init__.py +0 -0
  328. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/generators/adapter.py +0 -0
  329. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/guards.py +0 -0
  330. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/id_generator.py +0 -0
  331. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/invariants.py +0 -0
  332. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/issue_sync.py +0 -0
  333. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/lazy_visualize.py +0 -0
  334. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/lessons.py +0 -0
  335. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/lint_runner.py +0 -0
  336. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/observe.py +0 -0
  337. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/profiles.py +0 -0
  338. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/__init__.py +0 -0
  339. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/agents.py +0 -0
  340. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/references.py +0 -0
  341. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/prompts/workflows.py +0 -0
  342. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/regression.py +0 -0
  343. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/scripts.py +0 -0
  344. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/sec_scope.py +0 -0
  345. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/__init__.py +0 -0
  346. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/__init__.py +0 -0
  347. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  348. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  349. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  350. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  351. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/board.py +0 -0
  352. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/interface_summary.py +0 -0
  353. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/report.py +0 -0
  354. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/scaffold.py +0 -0
  355. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/skills/visualize.py +0 -0
  356. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/spec_status.py +0 -0
  357. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/test_mapper.py +0 -0
  358. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/utils.py +0 -0
  359. {pactkit-2.15.0 → pactkit-2.15.2}/src/pactkit/validators.py +0 -0
  360. {pactkit-2.15.0 → pactkit-2.15.2}/tests/conftest.py +0 -0
  361. {pactkit-2.15.0 → pactkit-2.15.2}/tests/e2e/__init__.py +0 -0
  362. {pactkit-2.15.0 → pactkit-2.15.2}/tests/e2e/cli/__init__.py +0 -0
  363. {pactkit-2.15.0 → pactkit-2.15.2}/tests/e2e/cli/test_cli_e2e.py +0 -0
  364. {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  365. {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  366. {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  367. {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  368. {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  369. {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  370. {pactkit-2.15.0 → pactkit-2.15.2}/tests/fixtures/api_call_parser/page.tsx +0 -0
  371. {pactkit-2.15.0 → pactkit-2.15.2}/tests/integration/__init__.py +0 -0
  372. {pactkit-2.15.0 → pactkit-2.15.2}/tests/integration/test_deploy_classic.py +0 -0
  373. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_agent_features.py +0 -0
  374. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_agent_frontmatter.py +0 -0
  375. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_agents_enrichment.py +0 -0
  376. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_audit.py +0 -0
  377. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_blast_radius.py +0 -0
  378. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_board_bug027.py +0 -0
  379. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_board_sections.py +0 -0
  380. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug001_skill_path.py +0 -0
  381. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug002_plugin_paths.py +0 -0
  382. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug003_multi_import.py +0 -0
  383. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug004_dead_set.py +0 -0
  384. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug005_archive_taskless.py +0 -0
  385. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug006_scan_excludes.py +0 -0
  386. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  387. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  388. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  389. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  390. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug011_stale_refs.py +0 -0
  391. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  392. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug013_config_single_source.py +0 -0
  393. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug014_version_hygiene.py +0 -0
  394. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  395. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  396. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug019_venv_deployment.py +0 -0
  397. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  398. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug025_release_delegation.py +0 -0
  399. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug026_version_sync.py +0 -0
  400. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug028_ghost_refs.py +0 -0
  401. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  402. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  403. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  404. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  405. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_021.py +0 -0
  406. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_022.py +0 -0
  407. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_023.py +0 -0
  408. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_024.py +0 -0
  409. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  410. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  411. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim003.py +0 -0
  412. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim004.py +0 -0
  413. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim005.py +0 -0
  414. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim006.py +0 -0
  415. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  416. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_check_command.py +0 -0
  417. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_check_extensions_072_073.py +0 -0
  418. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_check_playbook_072_073.py +0 -0
  419. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_command_frontmatter.py +0 -0
  420. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_command_visualize_modes.py +0 -0
  421. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_complexity.py +0 -0
  422. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_config_auto_merge.py +0 -0
  423. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_constitution_sharpening.py +0 -0
  424. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_context_gen.py +0 -0
  425. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_create_skill.py +0 -0
  426. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_cross_flow_matrix.py +0 -0
  427. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_deploy_base.py +0 -0
  428. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_deployer_cleanup.py +0 -0
  429. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_deployer_plugin.py +0 -0
  430. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_design_command.py +0 -0
  431. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_done_gates.py +0 -0
  432. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_draw_prompt.py +0 -0
  433. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_draw_references.py +0 -0
  434. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_drawio_mcp.py +0 -0
  435. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_garden.py +0 -0
  436. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_home_path_fix.py +0 -0
  437. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_hotfix_command.py +0 -0
  438. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_init_guard.py +0 -0
  439. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_init_playbook_074.py +0 -0
  440. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_interface_summary.py +0 -0
  441. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_lang_profiles.py +0 -0
  442. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_layer_violations.py +0 -0
  443. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_lessons_rotation_075.py +0 -0
  444. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_list_stories.py +0 -0
  445. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_mcp_integration.py +0 -0
  446. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_model_config.py +0 -0
  447. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_modular_constitution.py +0 -0
  448. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_monorepo_detect.py +0 -0
  449. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_multi_prefix.py +0 -0
  450. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_observe.py +0 -0
  451. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_pdca_slim.py +0 -0
  452. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_profiles.py +0 -0
  453. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_project_visibility.py +0 -0
  454. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompt_cli_refs.py +0 -0
  455. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompt_quality_075.py +0 -0
  456. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_prompts_package.py +0 -0
  457. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_release.py +0 -0
  458. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_release_field.py +0 -0
  459. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_release_v110.py +0 -0
  460. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_render_prompt.py +0 -0
  461. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_report_parser.py +0 -0
  462. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_report_unified.py +0 -0
  463. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_review_command.py +0 -0
  464. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_rules_enrichment.py +0 -0
  465. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_scaffold.py +0 -0
  466. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  467. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_schemas.py +0 -0
  468. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_script_extraction.py +0 -0
  469. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_session_context.py +0 -0
  470. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_skill_structure.py +0 -0
  471. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_skills_enrichment.py +0 -0
  472. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_slim_deps_088.py +0 -0
  473. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_smart_regression.py +0 -0
  474. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_sprint_command.py +0 -0
  475. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_stack_references.py +0 -0
  476. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_status_command.py +0 -0
  477. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_statusline.py +0 -0
  478. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story014_release.py +0 -0
  479. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  480. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story016_claude_md.py +0 -0
  481. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story017_init_claude_md.py +0 -0
  482. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story018_arch_staleness.py +0 -0
  483. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story019_bailout.py +0 -0
  484. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story020_horizon.py +0 -0
  485. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story021_rfc.py +0 -0
  486. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story022_decision_tree.py +0 -0
  487. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story023_test_quality.py +0 -0
  488. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story024_native_agent.py +0 -0
  489. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story025_ci_pipeline.py +0 -0
  490. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story026_issue_tracker.py +0 -0
  491. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story028_rule_scoping.py +0 -0
  492. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story029_doctor.py +0 -0
  493. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story030_lint.py +0 -0
  494. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story031_git_init_guard.py +0 -0
  495. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  496. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story033_config_backfill.py +0 -0
  497. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  498. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story035_readme_docs.py +0 -0
  499. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story037_regression_fix.py +0 -0
  500. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story038_call_graph_update.py +0 -0
  501. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story039_venv_config.py +0 -0
  502. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story040_layered_claude_md.py +0 -0
  503. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story043_active_clarify.py +0 -0
  504. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story044_consistency_check.py +0 -0
  505. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story045_auto_pr.py +0 -0
  506. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story046_agent_adapter.py +0 -0
  507. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story047_enterprise_flags.py +0 -0
  508. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story048_worktree_isolation.py +0 -0
  509. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story049_community_standards.py +0 -0
  510. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  511. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  512. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story052_conditional_github_release.py +0 -0
  513. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story053_impact_regression.py +0 -0
  514. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story055_commands.py +0 -0
  515. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story055_config.py +0 -0
  516. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story055_spec_linter.py +0 -0
  517. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story056_commands.py +0 -0
  518. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story056_config.py +0 -0
  519. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  520. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story058_opencode_extraction.py +0 -0
  521. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story058_routing_fix.py +0 -0
  522. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story060_init_hang.py +0 -0
  523. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story061_remove_thinking.py +0 -0
  524. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  525. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story064_venv_local_md.py +0 -0
  526. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story065_sprint_model.py +0 -0
  527. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story072_developer_prefix.py +0 -0
  528. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story106_lateral_scan.py +0 -0
  529. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  530. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  531. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim012_ci.py +0 -0
  532. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_clean.py +0 -0
  533. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_context.py +0 -0
  534. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_guard.py +0 -0
  535. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  536. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_next_id.py +0 -0
  537. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_regression.py +0 -0
  538. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  539. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim014_validators.py +0 -0
  540. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim015_doctor.py +0 -0
  541. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  542. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim017.py +0 -0
  543. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim018.py +0 -0
  544. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  545. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  546. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim022.py +0 -0
  547. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim023.py +0 -0
  548. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim024.py +0 -0
  549. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim025.py +0 -0
  550. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim027.py +0 -0
  551. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim028.py +0 -0
  552. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim029.py +0 -0
  553. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim030.py +0 -0
  554. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim031.py +0 -0
  555. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim032.py +0 -0
  556. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim033.py +0 -0
  557. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim034.py +0 -0
  558. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim035.py +0 -0
  559. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim036.py +0 -0
  560. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim037.py +0 -0
  561. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim038.py +0 -0
  562. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim039.py +0 -0
  563. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim040.py +0 -0
  564. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim041.py +0 -0
  565. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim042.py +0 -0
  566. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim043.py +0 -0
  567. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim044.py +0 -0
  568. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim045.py +0 -0
  569. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim046.py +0 -0
  570. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim047.py +0 -0
  571. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim048.py +0 -0
  572. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim049.py +0 -0
  573. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim051.py +0 -0
  574. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim052.py +0 -0
  575. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim053.py +0 -0
  576. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim054.py +0 -0
  577. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim055.py +0 -0
  578. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim056.py +0 -0
  579. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  580. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim063.py +0 -0
  581. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim065.py +0 -0
  582. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim076_multistack.py +0 -0
  583. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  584. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim078.py +0 -0
  585. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim079.py +0 -0
  586. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim080.py +0 -0
  587. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim081.py +0 -0
  588. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim082.py +0 -0
  589. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim083.py +0 -0
  590. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim084.py +0 -0
  591. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim095.py +0 -0
  592. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  593. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  594. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim102_version_marker.py +0 -0
  595. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim104_should_semantics.py +0 -0
  596. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim107.py +0 -0
  597. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim109_journey_spec.py +0 -0
  598. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
  599. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim114_journey_sync.py +0 -0
  600. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim119.py +0 -0
  601. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim120.py +0 -0
  602. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim121.py +0 -0
  603. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim125.py +0 -0
  604. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim126.py +0 -0
  605. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_story_slim127_managed_block.py +0 -0
  606. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_tools.py +0 -0
  607. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_topology_parsers_066.py +0 -0
  608. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_update_task.py +0 -0
  609. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_call_nested.py +0 -0
  610. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_chain_fix.py +0 -0
  611. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_modes.py +0 -0
  612. {pactkit-2.15.0 → pactkit-2.15.2}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -0,0 +1,5 @@
1
+ # CodeGraph data files — local to each machine, not for committing.
2
+ # Ignore everything in .codegraph/ except this file itself, so transient
3
+ # files (the database, daemon.pid, sockets, logs) never show up in git.
4
+ *
5
+ !.gitignore
@@ -4,6 +4,29 @@ 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.15.2] - 2026-07-02
8
+
9
+ ### Changed
10
+ - **Codegraph commands decoupled from prompts** (STORY-slim-132) — Replaced hardcoded codegraph CLI command lists with runtime `codegraph --help` discovery. PactKit no longer needs updates when codegraph changes its command signatures.
11
+
12
+ ### Fixed
13
+ - **Act Phase 0.6 board move command** (HOTFIX-slim-132) — Added explicit `board.py move_story` command template to prevent AI from guessing wrong subcommand syntax.
14
+ - **Prompt deployer** (HOTFIX-slim-131) — Insert @ references after YAML frontmatter so model: field is parsed correctly.
15
+ - **Skill frontmatter** (HOTFIX-slim-130) — Move @ references below YAML frontmatter in project-* skills.
16
+
17
+ ### Refactored
18
+ - **Prompt rules** — Moved large rules from @inject to on-demand Read to reduce initial context size.
19
+
20
+ ## [2.15.1] - 2026-06-10
21
+
22
+ ### Added
23
+ - **Engineering Concerns guide system** (STORY-slim-128) — On-demand NFR guide loading via trigger index. Plan Phase 2 scans requirement keywords and includes NFR decisions in Spec; Act Phase 1.5 loads matched guides (1-3 max). Initial 13 concerns: concurrency, async, configuration, observability, module-design, database, caching, api-integration, event-driven, resilience, memory-management, code-review-first, component-reuse.
24
+ - **6 additional engineering guides** (STORY-slim-129) — error-recovery (retry/backoff/idempotency), data-consistency (transactions/saga/optimistic lock), backwards-compatibility (API versioning/non-breaking migration), performance-antipatterns (N+1/unbounded queries/indexing), graceful-shutdown (SIGTERM/drain/cleanup order), testing-strategy (boundary/mock vs real/isolation). Total: 19 guides.
25
+
26
+ ### Fixed
27
+ - **Spec linter** — Accept heading format for Security Scope `SEC-*` entries.
28
+ - **CI** — Remove obsolete `.opencode/pactkit.yaml` test.
29
+
7
30
  ## [2.15.0] - 2026-06-04
8
31
 
9
32
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.15.0
3
+ Version: 2.15.2
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
@@ -63,3 +63,6 @@
63
63
  | 2026-03-26 | test_story_slim056.py _init_project() helper creates realistic pactkit project fixture for subprocess E2E tests; 60 tests cover all 25 subcommands | test_story_slim056.py:_init_project |
64
64
  | 2026-03-26 | entry_points auto-discovery with _load_entry_point_deployers() enables pip install pactkit-opencode to self-register; pre-existing tests referencing extracted functions must be updated to import from adapter package | deployer.py:_load_entry_point_deployers |
65
65
  | 2026-03-26 | VALID_FORMATS auto-derives from FORMAT_PROFILES.keys() — removing a profile cascades to config, CLI, and deployer with zero manual sync | profiles.py:FORMAT_PROFILES |
66
+ | 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
67
+ | 2026-03-26 | Thin adapter conversion: pactkit-codex reduced from 15,356 lines (full fork) to 668 lines (thin adapter) by importing core via DeployerBase. Key: deploy_codex_playbooks needs explicit path replacement for ALL format prefixes (~/.claude/, ~/.config/opencode/ → ~/.codex/) | pactkit_codex/deployer.py:deploy_codex_playbooks |
68
+ | 2026-03-27 | When migrating commands to skills (subdir/SKILL.md format), all path assertions in pre-existing tests must be updated in the same commit — 17 tests broke because they asserted flat commands/*.md paths | deployer.py:_deploy_commands |
@@ -2,9 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-26 | DeployerBase static methods use lazy imports to avoid circular dependencies between deploy_base.py and deployer.py | deploy_base.py:DeployerBase.render_prompt |
6
- | 2026-03-26 | Thin adapter conversion: pactkit-codex reduced from 15,356 lines (full fork) to 668 lines (thin adapter) by importing core via DeployerBase. Key: deploy_codex_playbooks needs explicit path replacement for ALL format prefixes (~/.claude/, ~/.config/opencode/ → ~/.codex/) | pactkit_codex/deployer.py:deploy_codex_playbooks |
7
- | 2026-03-27 | When migrating commands to skills (subdir/SKILL.md format), all path assertions in pre-existing tests must be updated in the same commit — 17 tests broke because they asserted flat commands/*.md paths | deployer.py:_deploy_commands |
8
5
  | 2026-03-30 | Frontend API path convention bugs are structurally preventable: ApiCallParser+api_convention_summary in trace phase surfaces prefix/wrapper conventions before implementation, eliminating a class of copy-paste path errors | visualize.py:ApiCallParser |
9
6
  | 2026-03-31 | Rendering-only changes to visualize.py can be isolated by extracting a shared render helper (_render_nested_call_graph) that both forward and reverse BFS call — keeps AST parsing untouched | visualize.py:_render_nested_call_graph |
10
7
  | 2026-03-31 | dict.update() on call_edges causes last-wins overwrite when scanning same-name functions across files; use extend-merge pattern instead | visualize.py:_build_call_graph |
@@ -53,3 +50,6 @@
53
50
  | 2026-05-26 | SKILL.md model: frontmatter is passed through by deployer without transformation — source prompts in commands.py/workflows.py are the single source of truth for deployed skill metadata | commands.py:COMMANDS_CONTENT |
54
51
  | 2026-06-01 | codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations | lazy_visualize.py:codegraph_sync |
55
52
  | 2026-06-01 | Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md | deployer.py:_upsert_claude_md_managed_block |
53
+ | 2026-06-10 | Engineering guides are additive: new GUIDES_FILES entries auto-deploy via _deploy_guides() without deployer changes. Test impact limited to count assertions in test_story_slim128. | src/pactkit/prompts/guides.py:GUIDES_FILES |
54
+ | 2026-06-29 | Large @inject rules (architecture 11KB, solution 8.4KB, engineering 4.3KB) removed from COMMAND_RULES_MAP — loaded on-demand via Read in playbooks. Saves ~12,500 tokens/PDCA session. | src/pactkit/prompts/rules.py:COMMAND_RULES_MAP |
55
+ | 2026-07-02 | Hardcoding external tool CLI commands in SKILL_VISUALIZE_MD and deployer.py creates upgrade coupling — replaced with codegraph --help runtime discovery in _build_claude_md_managed_content() | src/pactkit/generators/deployer.py:_build_claude_md_managed_content |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 4009+ tests must pass before any commit to `main`.
18
+ 1. All 4032+ 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`.
@@ -0,0 +1,37 @@
1
+
2
+ ### [STORY-slim-126] codegraph sync code enforcement
3
+ > Spec: docs/specs/STORY-slim-126.md
4
+
5
+ - [x] Add codegraph_sync() function
6
+ - [x] Integrate into visualize path
7
+ - [x] Add pactkit sync subcommand
8
+ - [x] Remove prompt instructions
9
+ - [x] Unit tests
10
+
11
+ ### [STORY-slim-127] project CLAUDE.md managed-block update
12
+ > Spec: docs/specs/STORY-slim-127.md
13
+
14
+ - [x] Add marker constants
15
+ - [x] Extract managed content builder
16
+ - [x] Rewrite _generate_project_claude_md with upsert
17
+ - [x] Unit tests
18
+
19
+ ### [STORY-slim-129] Engineering Concerns Guide Expansion — 6 Additional NFR Guides
20
+ > Spec: docs/specs/STORY-slim-129.md
21
+
22
+ - [x] Add 6 guide files to guides.py
23
+ - [x] Update trigger index in rules.py
24
+ - [x] Update test expectations 13→19
25
+ - [x] Verify deployment
26
+
27
+ ### [STORY-slim-128] Engineering Concerns: Guide-based NFR enforcement
28
+ > Spec: docs/specs/STORY-slim-128.md
29
+
30
+ - [x] Create guides.py with 13 guide contents
31
+ - [x] Add trigger index to rules.py
32
+ - [x] Extend deployer for guides/ subdirectory
33
+ - [x] Enhance plan Phase 2 with NFR assessment
34
+ - [x] Enhance act Phase 1.5 with guide loading
35
+ - [x] Config registration + COMMAND_RULES_MAP
36
+ - [x] Multi-format parity
37
+ - [x] Unit tests
@@ -0,0 +1,13 @@
1
+
2
+ ### [STORY-slim-132] Decouple codegraph commands from hardcoded prompt
3
+ > Spec: docs/specs/STORY-slim-132.md
4
+
5
+ - [x] Replace skills.py codegraph block with help fallback
6
+ - [x] Replace deployer.py codegraph section
7
+ - [x] Update global CLAUDE.md
8
+ - [x] Remove MCP tool name list
9
+
10
+ ### [HOTFIX-slim-130] Fix skill frontmatter parsing
11
+ > Spec: docs/specs/HOTFIX-slim-130.md
12
+
13
+ - [x] Move @ references below YAML frontmatter block in all project-* skills
@@ -0,0 +1,29 @@
1
+ # Project Context (Auto-generated)
2
+ > Last updated: 2026-07-02T11:00:51+08:00 by pactkit context
3
+
4
+ ## Sprint Status
5
+ Backlog: 4 | In Progress: 0 | Done: 0 stories
6
+
7
+ ## Current Stories
8
+ None
9
+
10
+ ## Recent Completions
11
+ None
12
+
13
+ ## Active Branches
14
+ + claude/naughty-euclid-e6a787
15
+ develop
16
+ * main
17
+
18
+ ## Key Decisions
19
+ - codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations
20
+ - Managed-block pattern (start/end markers + regex replace) is the canonical way to update mixed-ownership files — same pattern for CLAUDE.md and CLAUDE.local.md
21
+ - Engineering guides are additive: new GUIDES_FILES entries auto-deploy via _deploy_guides() without deployer changes. Test impact limited to count assertions in test_story_slim128.
22
+ - Large @inject rules (architecture 11KB, solution 8.4KB, engineering 4.3KB) removed from COMMAND_RULES_MAP — loaded on-demand via Read in playbooks. Saves ~12,500 tokens/PDCA session.
23
+ - Hardcoding external tool CLI commands in SKILL_VISUALIZE_MD and deployer.py creates upgrade coupling — replaced with codegraph --help runtime discovery in _build_claude_md_managed_content()
24
+
25
+ ## Next Recommended Action
26
+ `/project-plan`
27
+
28
+ ## Agent Continuation
29
+ No active work session.
@@ -26,6 +26,17 @@
26
26
  - [ ] Fix project-done
27
27
  - [ ] Fix project-hotfix
28
28
 
29
+ ### [HOTFIX-slim-131] Fix deployer @ refs before frontmatter
30
+ > Spec: docs/specs/HOTFIX-slim-131.md
31
+
32
+ - [ ] Fix _deploy_commands prepend order
33
+
34
+
35
+ ### [HOTFIX-slim-132] Add explicit board.py move_story command to project-act
36
+ > Spec: docs/specs/HOTFIX-slim-132.md
37
+
38
+ - [ ] Add move_story command template to Phase 0.6
39
+
29
40
  ## 🔄 In Progress
30
41
 
31
42
  ## ✅ Done
@@ -0,0 +1,104 @@
1
+ # HOTFIX-slim-130: Fix skill frontmatter parsing — move @ references below YAML block
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-130 |
6
+ | Status | Open |
7
+ | Priority | P1 |
8
+ | Release | 2.15.2 |
9
+
10
+ ## Background
11
+
12
+ All 11 `project-*` skills have `@` reference lines (file includes) placed **before** the YAML frontmatter block (`---`). Claude Code's skill parser requires frontmatter to start on line 1 of the file. When `@` lines precede `---`, the entire frontmatter is treated as plain text — `model`, `allowed-tools`, and `description` fields are silently ignored.
13
+
14
+ **Impact**: Every `/project-*` command runs on the session's default model (opus) regardless of the `model:` directive in frontmatter. This wastes tokens (opus for tasks that should use sonnet) and breaks the model routing strategy defined in `pactkit.yaml`.
15
+
16
+ **Root cause**: Skill files were authored with `@` includes at the top for readability, unaware that this breaks YAML frontmatter detection.
17
+
18
+ ## Affected Files
19
+
20
+ All skills matching `~/.claude/skills/project-*/SKILL.md` (11 files):
21
+
22
+ 1. `project-act/SKILL.md`
23
+ 2. `project-check/SKILL.md`
24
+ 3. `project-clarify/SKILL.md`
25
+ 4. `project-design/SKILL.md`
26
+ 5. `project-done/SKILL.md`
27
+ 6. `project-hotfix/SKILL.md`
28
+ 7. `project-init/SKILL.md`
29
+ 8. `project-plan/SKILL.md`
30
+ 9. `project-pr/SKILL.md`
31
+ 10. `project-release/SKILL.md`
32
+ 11. `project-sprint/SKILL.md`
33
+
34
+ ## Requirements
35
+
36
+ ### R1: Frontmatter MUST be first in file (MUST)
37
+
38
+ Every `SKILL.md` file MUST start with `---` on line 1. No content (including `@` references) may precede the frontmatter block.
39
+
40
+ ### R2: @ references MUST move below frontmatter (MUST)
41
+
42
+ All `@` include lines MUST be placed immediately after the closing `---` of the frontmatter block, before the markdown body. Preserve the original set of references — do not add or remove any.
43
+
44
+ ### R3: Existing frontmatter fields preserved (MUST)
45
+
46
+ All existing frontmatter fields (`description`, `allowed-tools`, `model`) MUST remain unchanged in value. Only their position in the file changes.
47
+
48
+ ## Acceptance Criteria
49
+
50
+ ### AC1: Frontmatter starts on line 1 (R1)
51
+
52
+ - **Given** any file in `~/.claude/skills/project-*/SKILL.md`
53
+ - **When** I read line 1
54
+ - **Then** it MUST be exactly `---`
55
+
56
+ ### AC2: Model field is parseable (R1, R3)
57
+
58
+ - **Given** `project-act/SKILL.md` with `model: sonnet` in frontmatter
59
+ - **When** Claude Code loads the skill
60
+ - **Then** the skill executes on sonnet, not the session default
61
+
62
+ ### AC3: @ references still present (R2)
63
+
64
+ - **Given** any affected skill file
65
+ - **When** I count `@` reference lines
66
+ - **Then** the count matches the original (no references lost or added)
67
+
68
+ ### AC4: No content change (R3)
69
+
70
+ - **Given** the markdown body of any affected skill
71
+ - **When** compared to pre-fix content (excluding line position)
72
+ - **Then** all instructions, phases, and protocols are identical
73
+
74
+ ## Fix Pattern
75
+
76
+ Before (broken):
77
+ ```markdown
78
+ @~/.claude/skills/_rules/04-architecture-principles.md
79
+ @~/.claude/rules/09-credential-safety.md
80
+
81
+ ---
82
+ description: "Implement code per Spec, strict TDD"
83
+ model: sonnet
84
+ ---
85
+
86
+ # Command: Act
87
+ ```
88
+
89
+ After (correct):
90
+ ```markdown
91
+ ---
92
+ description: "Implement code per Spec, strict TDD"
93
+ model: sonnet
94
+ ---
95
+
96
+ @~/.claude/skills/_rules/04-architecture-principles.md
97
+ @~/.claude/rules/09-credential-safety.md
98
+
99
+ # Command: Act
100
+ ```
101
+
102
+ ## Security Scope
103
+
104
+ SEC-1: No credential or secret handling involved. Pure file reformatting.
@@ -0,0 +1,21 @@
1
+ # HOTFIX-slim-131: Fix deployer prepending @ references before YAML frontmatter
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-131 |
6
+ | Status | In Progress |
7
+ | Priority | P0 |
8
+ | Release | 2.15.2 |
9
+
10
+ ## Background
11
+
12
+ `_deploy_commands()` in deployer.py prepends `_build_command_rules_header()` output (@ reference lines) before the command content which includes YAML frontmatter. This pushes frontmatter away from line 1, causing Claude Code to not parse `model:`, `description:`, and `allowed-tools:` fields. The `model:` frontmatter (added in STORY-slim-125) never takes effect at runtime.
13
+
14
+ ## Fix
15
+
16
+ Insert @ references after the closing `---` of frontmatter, not before the opening `---`.
17
+
18
+ ## Target
19
+
20
+ - File: `src/pactkit/generators/deployer.py`
21
+ - Function: `_deploy_commands()` (line ~1008)
@@ -0,0 +1,23 @@
1
+ # HOTFIX-slim-132: Add explicit board.py move_story command to project-act playbook
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-132 |
6
+ | Status | Done |
7
+ | Priority | P2 |
8
+ | Release | 2.16.0 |
9
+
10
+ ## Background
11
+
12
+ AI consistently guesses wrong board.py subcommand syntax (tries `move_to_in_progress`, `"In Progress"`) because project-act Phase 0.6 only says "move it to In Progress" without giving the exact CLI invocation.
13
+
14
+ ## Fix
15
+
16
+ In `project-act/SKILL.md` Phase 0.6 step 3, replace vague instruction with explicit command template:
17
+ ```
18
+ python3 ~/.claude/skills/pactkit-board/scripts/board.py move_story "{STORY_ID}" "in_progress"
19
+ ```
20
+
21
+ ## Target
22
+
23
+ `~/.claude/skills/project-act/SKILL.md:46`
@@ -0,0 +1,157 @@
1
+ # STORY-slim-128: Engineering Concerns: Guide-based NFR enforcement
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-128 |
6
+ | Status | Draft |
7
+ | Priority | P1 |
8
+ | Release | 2.16.0 |
9
+
10
+ ## Background
11
+
12
+ LLM 编程时系统性缺失非功能性需求(NFR)考量:并发模型、超时策略、缓存一致性、内存管理等。
13
+ 现有 PactKit 规则体系中,`06-solution-design.md` 只覆盖"复用已有组件",缺乏对其他 12 类工程关注点的引导。
14
+
15
+ 核心矛盾:如果把所有 NFR 规则放入常驻 prompt,context 膨胀导致注意力衰减;如果不放,LLM 就忽略它们。
16
+
17
+ 解决方案:**按需加载的指南系统** — 一个轻量触发索引(常驻,~40行)+ 13 个精炼指南文件(按需加载,每个 <50 行)。
18
+ Plan 阶段:根据需求关键词强制回答 NFR 决策问题(写入 Spec)。
19
+ Act 阶段:根据 Spec 中标注的 concerns,动态加载对应指南作为实现约束。
20
+
21
+ ### 调用链
22
+ ```
23
+ rules.py (RULES_MODULES["engineering"]) → deployer._deploy_rules() → ~/.claude/skills/_rules/07-engineering-concerns.md
24
+ rules.py (GUIDES_FILES) → deployer._deploy_guides() → ~/.claude/skills/_rules/guides/*.md
25
+ commands.py (plan Phase 2 扩展) → deployed SKILL.md
26
+ commands.py (act Phase 1.5 扩展) → deployed SKILL.md
27
+ ```
28
+
29
+ ## Requirements
30
+
31
+ ### R1: Trigger Index Rule (MUST)
32
+
33
+ 新增 `RULES_MODULES["engineering"]` 和 `RULES_ONDEMAND_FILES["engineering"]`,部署为 `07-engineering-concerns.md`。
34
+ 内容为触发索引表(~40行):列出关键词→concern 映射,以及 concern→guide 文件的路由表。
35
+ 此文件通过 `@import` 被 plan/act 命令加载。
36
+
37
+ ### R2: Guides Deployment Mechanism (MUST)
38
+
39
+ 在 `deployer.py` 中新增 `_deploy_guides()` 函数,将 13 个精炼指南文件部署到 `~/.claude/skills/_rules/guides/` 目录。
40
+ 所有 format 均需支持:Claude Code(文件部署)、OpenCode(inline 或文件)、Codex(文件)、Copilot(文件)。
41
+ 指南文件源定义在新文件 `src/pactkit/prompts/guides.py` 中(避免 `rules.py` 过长)。
42
+
43
+ ### R3: Guides Content — 13 Engineering Guides (MUST)
44
+
45
+ 每个指南文件 < 50 行,格式统一:决策表 + MUST 清单 + NEVER 清单 + 代码模板。
46
+ 覆盖:concurrency、async-patterns、configuration、observability、module-design、database、caching、api-integration、event-driven、resilience、memory-management、code-review-first、component-reuse。
47
+
48
+ ### R4: Plan Command Enhancement (MUST)
49
+
50
+ `project-plan` Phase 2 新增 "Engineering Concerns Assessment" 步骤:
51
+ - 扫描需求关键词(定时/API/数据库/缓存/事件/并发等)
52
+ - 匹配到的 concern → Spec 的 Technical Design 中 MUST 包含对应 NFR 决策
53
+ - 未匹配 → 不强制(避免噪音)
54
+
55
+ ### R5: Act Command Enhancement (MUST)
56
+
57
+ `project-act` 新增 Phase 1.5 "Engineering Concerns Loading":
58
+ - 读取 Spec 的 Technical Design → 识别标注的 engineering concerns
59
+ - 加载对应的指南文件(`read` 指令)
60
+ - MUST 只加载相关的 1-3 个,NEVER 全部加载
61
+
62
+ ### R6: Config Integration (SHOULD)
63
+
64
+ 在 `VALID_RULES` 中注册 `"07-engineering-concerns"`。
65
+ 在 `COMMAND_RULES_MAP` 中为 `project-plan` 和 `project-act` 添加 `"engineering"` key。
66
+ 支持通过 `pactkit.yaml` 的 `rules` 配置项禁用。
67
+
68
+ ### R7: Multi-format Parity (MUST)
69
+
70
+ OpenCode、Codex、Copilot 格式均需部署 guides 内容:
71
+ - OpenCode/Codex:作为独立文件部署到对应 rules 目录,或 inline 嵌入
72
+ - Copilot:写入对应的 prompt 文件中(copilot 不支持动态文件引用,需 inline)
73
+ - 各格式 plan/act playbook 均需包含 engineering concerns phase
74
+
75
+ ## Acceptance Criteria
76
+
77
+ ### AC1: Trigger Index Deployed (R1, R6)
78
+
79
+ - **Given** PactKit 已安装,用户运行 `pactkit init`
80
+ - **When** deployer 执行 classic format 部署
81
+ - **Then** `~/.claude/skills/_rules/07-engineering-concerns.md` 文件存在,内容包含关键词→concern 映射表和 concern→guide 路由表
82
+
83
+ ### AC2: All 13 Guides Deployed (R2, R3)
84
+
85
+ - **Given** 用户运行 `pactkit init` 或 `pactkit update`
86
+ - **When** deployer 执行部署
87
+ - **Then** `~/.claude/skills/_rules/guides/` 目录下存在 13 个 .md 文件,每个文件 < 50 行
88
+
89
+ ### AC3: Plan Phase Triggers NFR Questions (R4)
90
+
91
+ - **Given** 一个包含 "从第三方 API 拉取数据存入数据库" 的 Story
92
+ - **When** Plan Phase 2 执行 Engineering Concerns Assessment
93
+ - **Then** Spec 的 Technical Design 中包含:并发模型决策、API 超时/重试策略、数据库连接管理策略
94
+
95
+ ### AC4: Act Phase Loads Relevant Guides Only (R5)
96
+
97
+ - **Given** Spec 的 Technical Design 标注了 `concerns: [database, api-integration]`
98
+ - **When** Act Phase 1.5 执行
99
+ - **Then** 只加载 `guides/database.md` 和 `guides/api-integration.md`,不加载其他 11 个指南
100
+
101
+ ### AC5: OpenCode/Codex/Copilot Parity (R7)
102
+
103
+ - **Given** 用户运行 `pactkit init --format opencode`
104
+ - **When** deployer 执行 OpenCode 格式部署
105
+ - **Then** 对应目录下存在 engineering concerns trigger index + guides 内容(inline 或文件形式)
106
+
107
+ ## Target Call Chain
108
+
109
+ ```
110
+ # 部署链
111
+ pactkit init/update
112
+ → deployer._deploy_classic() (deployer.py:302)
113
+ → _deploy_rules(claude_root, enabled_rules) (deployer.py:584)
114
+ → atomic_write(ondemand_dir / "07-engineering-concerns.md") — R1
115
+ → _deploy_guides(claude_root) (NEW) (deployer.py:NEW)
116
+ → atomic_write(guides_dir / "*.md") x13 — R2
117
+ → _deploy_commands(skills_dir, ...) (deployer.py:917)
118
+ → _build_command_rules_header("project-plan") — includes "engineering" — R4
119
+ → _build_command_rules_header("project-act") — includes "engineering" — R5
120
+
121
+ # 指南内容源
122
+ src/pactkit/prompts/guides.py (NEW)
123
+ → GUIDES_FILES: dict[str, str] — filename → content
124
+ → Referenced by deployer._deploy_guides()
125
+ ```
126
+
127
+ ## Implementation Steps
128
+
129
+ | Step | File | Action | Dependencies | Risk |
130
+ |------|------|--------|-------------|------|
131
+ | 1 | `src/pactkit/prompts/guides.py` | 新建:定义 GUIDES_FILES dict(13 个指南内容) | None | Low |
132
+ | 2 | `src/pactkit/prompts/rules.py` | 新增 RULES_MODULES["engineering"] 触发索引内容 + RULES_ONDEMAND_FILES 注册 | Step 1 | Low |
133
+ | 3 | `src/pactkit/config.py` | VALID_RULES 新增 "07-engineering-concerns" | Step 2 | Low |
134
+ | 4 | `src/pactkit/generators/deployer.py` | 新增 _deploy_guides() + 在 _deploy_classic/opencode/codex/copilot 中调用 | Steps 1-3 | Medium |
135
+ | 5 | `src/pactkit/prompts/commands.py` | plan Phase 2 新增 Engineering Concerns Assessment 段落 | Step 2 | Low |
136
+ | 6 | `src/pactkit/prompts/commands.py` | act 新增 Phase 1.5 Engineering Concerns Loading 段落 | Step 2 | Low |
137
+ | 7 | `src/pactkit/prompts/rules.py` | COMMAND_RULES_MAP 为 plan/act 添加 "engineering" | Step 3 | Low |
138
+ | 8 | `tests/unit/` | 测试:deployer 部署 guides 目录、plan/act 包含新 phase | All | Low |
139
+
140
+ ## Security Scope
141
+
142
+ | Check | Applicable | Reason |
143
+ |-------|------------|--------|
144
+ | SEC-1 | N/A | No secrets involved — only prompt/doc content |
145
+ | SEC-2 | N/A | No user input processing |
146
+ | SEC-3 | N/A | No database queries |
147
+ | SEC-4 | N/A | No rendering |
148
+ | SEC-5 | N/A | No auth |
149
+ | SEC-6 | N/A | No endpoints |
150
+ | SEC-7 | N/A | No error messages |
151
+ | SEC-8 | N/A | No new dependencies |
152
+
153
+ ## Out of Scope
154
+
155
+ - CI/lint 自动化检测(semgrep/ruff 自定义规则)— 后续 Story
156
+ - 指南文件的热加载/动态选择 AI 判断 — 本 Story 用关键词匹配,不用 LLM 判断
157
+ - Check 阶段的完整 13 项 checklist 验证 — 可选后续 Story
@@ -0,0 +1,134 @@
1
+ # STORY-slim-129: Engineering Concerns Guide Expansion — 6 Additional NFR Guides
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-129 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.15.1 |
9
+
10
+ ## Background
11
+
12
+ STORY-slim-128 established the Engineering Concerns guide system with 13 on-demand guides covering concurrency, async, configuration, observability, module design, database, caching, API integration, event-driven, resilience, memory management, code-review-first, and component-reuse.
13
+
14
+ Analysis of common LLM-generated code weaknesses identified 6 additional high-frequency gaps:
15
+ 1. **Error Recovery & Retry** — LLM try/catch blocks almost always just `log + return None`, missing retry with backoff, idempotency, partial failure handling
16
+ 2. **Data Consistency** — multi-table/multi-service writes without transaction strategy, no idempotency key, no compensation
17
+ 3. **Backwards Compatibility** — LLM defaults to breaking changes for API/schema modifications
18
+ 4. **Performance Anti-patterns** — N+1 queries, unbounded list APIs, missing indices, hot-path serialization
19
+ 5. **Graceful Shutdown** — no SIGTERM handler, no in-flight request drain, no resource cleanup ordering
20
+ 6. **Testing Strategy** — LLM writes tests without considering boundary testing, mock vs real, or test isolation
21
+
22
+ ## Requirements
23
+
24
+ ### R1: Six New Guide Files (MUST)
25
+
26
+ Add 6 new guide files to `GUIDES_FILES` in `src/pactkit/prompts/guides.py`:
27
+ - `error-recovery.md` — retry strategies, backoff, idempotency, partial failure
28
+ - `data-consistency.md` — distributed transactions, idempotency keys, optimistic/pessimistic locking, Saga
29
+ - `backwards-compatibility.md` — API versioning, non-breaking DB migrations, protocol evolution
30
+ - `performance-antipatterns.md` — N+1 queries, unbounded queries, missing indexes, hot-path costs
31
+ - `graceful-shutdown.md` — SIGTERM handling, request drain, resource cleanup order
32
+ - `testing-strategy.md` — boundary testing, mock vs real, test isolation, deterministic tests
33
+
34
+ Each guide MUST follow existing format: Decision Table + MUST + NEVER + Template, ≤ 50 lines.
35
+
36
+ ### R2: Trigger Index Update (MUST)
37
+
38
+ Add 6 new rows to the keyword→concern table in `RULES_MODULES["engineering"]` in `src/pactkit/prompts/rules.py`:
39
+ - error-recovery: retry/重试/backoff/幂等/idempoten/partial failure
40
+ - data-consistency: 一致性/consistency/saga/补偿/idempotency key/分布式事务
41
+ - backwards-compatibility: 兼容/backward/breaking change/deprecat/migration/版本
42
+ - performance-antipatterns: N+1/unbounded/分页/pagina/index/索引/热路径/hot path
43
+ - graceful-shutdown: shutdown/优雅关闭/SIGTERM/drain/信号处理
44
+ - testing-strategy: 测试策略/test strategy/mock/stub/boundary/隔离/isolation
45
+
46
+ ### R3: Guide Loading Table Update (MUST)
47
+
48
+ Add 6 new rows to the Act Phase Guide Loading Table in the same `engineering` module content, mapping concern→guide file path.
49
+
50
+ ### R4: Pre-existing Test Update (MUST)
51
+
52
+ Update hardcoded counts in tests:
53
+ - `test_story_slim128_engineering_concerns.py`: 13→19 guide count
54
+ - `test_story_slim026.py`: plan prompt char baseline if exceeded
55
+ - `test_story063_prompt_slimming.py`: BASELINE_TOTAL_CHARS if exceeded
56
+ - Trigger index "NEVER load all 13" → "NEVER load all 19"
57
+
58
+ ### R5: Token Budget Control (SHOULD)
59
+
60
+ Total trigger index growth SHOULD be ≤ 8 lines (6 keyword rows + 6 guide path rows = 12 table rows, but table rows are short). The trigger index must remain under ~60 lines total.
61
+
62
+ ### R6: Guide Loading Cap (MUST)
63
+
64
+ Maintain the "MUST load only 1-3 relevant guides" instruction. Do NOT increase the cap — more guides available does not mean more should be loaded simultaneously.
65
+
66
+ ## Acceptance Criteria
67
+
68
+ ### AC1: Guide Files Registered (R1)
69
+
70
+ - **Given** `GUIDES_FILES` dict in `src/pactkit/prompts/guides.py`
71
+ - **When** the module is loaded
72
+ - **Then** it contains exactly 19 entries (13 original + 6 new), each ≤ 50 lines with MUST and NEVER sections
73
+
74
+ ### AC2: Trigger Index Extended (R2, R3)
75
+
76
+ - **Given** `RULES_MODULES["engineering"]` in rules.py
77
+ - **When** the content is inspected
78
+ - **Then** the keyword table has 19 rows and the guide loading table has 19 rows
79
+
80
+ ### AC3: Deployment Creates 19 Guide Files (R1)
81
+
82
+ - **Given** `_deploy_guides()` is called
83
+ - **When** deployment completes
84
+ - **Then** 19 `.md` files exist in `skills/_rules/guides/` directory
85
+
86
+ ### AC4: Guide Loading Cap Unchanged (R6)
87
+
88
+ - **Given** trigger index content
89
+ - **When** inspected for loading instruction
90
+ - **Then** still says "MUST load only 1-3 relevant guides" (not 4+)
91
+
92
+ ### AC5: All Tests Pass (R4)
93
+
94
+ - **Given** updated test expectations (19 guides)
95
+ - **When** full test suite runs
96
+ - **Then** all tests pass including pre-existing count assertions
97
+
98
+ ## Target Call Chain
99
+
100
+ ```
101
+ guides.py::GUIDES_FILES (add 6 entries)
102
+ → rules.py::RULES_MODULES["engineering"] (extend keyword table + guide table)
103
+ → deployer.py::_deploy_guides() (already handles any GUIDES_FILES count)
104
+ → tests/ (update count assertions 13→19)
105
+ ```
106
+
107
+ ## Implementation Steps
108
+
109
+ | Step | File | Action | Dependencies | Risk |
110
+ |------|------|--------|-------------|------|
111
+ | 1 | `src/pactkit/prompts/guides.py` | Add 6 new guide entries to GUIDES_FILES | None | Low |
112
+ | 2 | `src/pactkit/prompts/rules.py` | Add 6 keyword rows + 6 guide loading rows to engineering module | Step 1 | Low |
113
+ | 3 | `tests/unit/test_story_slim128_engineering_concerns.py` | Update count 13→19, update EXPECTED_GUIDES set | Steps 1-2 | Low |
114
+ | 4 | Other test files | Update baselines if char counts exceeded | Steps 1-2 | Low |
115
+
116
+ ## Security Scope
117
+
118
+ | Check | Applicable | Reason |
119
+ |-------|------------|--------|
120
+ | SEC-1 Input Validation | N/A | docs/tests only |
121
+ | SEC-2 Auth/AuthZ | N/A | docs/tests only |
122
+ | SEC-3 Data Exposure | N/A | docs/tests only |
123
+ | SEC-4 Cryptography | N/A | docs/tests only |
124
+ | SEC-5 Error Handling | N/A | docs/tests only |
125
+ | SEC-6 Dependencies | N/A | docs/tests only |
126
+ | SEC-7 Logging | N/A | docs/tests only |
127
+ | SEC-8 Config/Secrets | N/A | docs/tests only |
128
+
129
+ ## Out of Scope
130
+
131
+ - No changes to deployer logic (already handles dynamic GUIDES_FILES count)
132
+ - No changes to command prompts (plan/act phases already reference the trigger index)
133
+ - No new RULES_ONDEMAND_FILES entry needed (engineering key already exists)
134
+ - No config.py changes (VALID_RULES already includes 07-engineering-concerns)