pactkit 2.14.2__tar.gz → 2.15.1__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 (605) hide show
  1. {pactkit-2.14.2 → pactkit-2.15.1}/CHANGELOG.md +19 -0
  2. {pactkit-2.14.2 → pactkit-2.15.1}/PKG-INFO +21 -1
  3. {pactkit-2.14.2 → pactkit-2.15.1}/README.md +17 -0
  4. {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/archive/lessons_archive_202603.md +1 -0
  5. {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/lessons.md +1 -1
  6. {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/rules.md +1 -1
  7. pactkit-2.15.1/docs/product/archive/archive_202606.md +37 -0
  8. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/context.md +2 -2
  9. pactkit-2.15.1/docs/specs/STORY-slim-128.md +157 -0
  10. pactkit-2.15.1/docs/specs/STORY-slim-129.md +134 -0
  11. {pactkit-2.14.2 → pactkit-2.15.1}/pyproject.toml +5 -2
  12. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/__init__.py +1 -1
  13. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/config.py +1 -0
  14. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/deploy_base.py +6 -0
  15. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/deployer.py +29 -0
  16. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/commands.py +18 -2
  17. pactkit-2.15.1/src/pactkit/prompts/guides.py +657 -0
  18. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/rules.py +67 -3
  19. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/schemas.py +2 -1
  20. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/spec_linter.py +1 -1
  21. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_config.py +2 -2
  22. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompt_structural_invariants.py +2 -2
  23. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_selective_deploy.py +2 -2
  24. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story042_spec_linter.py +42 -0
  25. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story063_prompt_slimming.py +2 -1
  26. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim010_dry_refactor.py +0 -31
  27. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim011_command_rules.py +2 -2
  28. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim021.py +3 -3
  29. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim026.py +2 -2
  30. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim032.py +4 -0
  31. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim033.py +4 -0
  32. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim034.py +4 -0
  33. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim112_rules_split.py +8 -7
  34. pactkit-2.15.1/tests/unit/test_story_slim128_engineering_concerns.py +201 -0
  35. pactkit-2.14.2/.opencode/pactkit.yaml +0 -23
  36. pactkit-2.14.2/docs/product/archive/archive_202606.md +0 -17
  37. {pactkit-2.14.2 → pactkit-2.15.1}/.codegraph/.gitignore +0 -0
  38. {pactkit-2.14.2 → pactkit-2.15.1}/.github/workflows/pactkit.yml +0 -0
  39. {pactkit-2.14.2 → pactkit-2.15.1}/.github/workflows/publish.yml +0 -0
  40. {pactkit-2.14.2 → pactkit-2.15.1}/.gitignore +0 -0
  41. {pactkit-2.14.2 → pactkit-2.15.1}/AGENTS.md +0 -0
  42. {pactkit-2.14.2 → pactkit-2.15.1}/CODE_OF_CONDUCT.md +0 -0
  43. {pactkit-2.14.2 → pactkit-2.15.1}/CONTRIBUTING.md +0 -0
  44. {pactkit-2.14.2 → pactkit-2.15.1}/LICENSE +0 -0
  45. {pactkit-2.14.2 → pactkit-2.15.1}/SECURITY.md +0 -0
  46. {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  47. {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/harness_audit.json +0 -0
  48. {pactkit-2.14.2 → pactkit-2.15.1}/docs/architecture/governance/philosophy.md +0 -0
  49. {pactkit-2.14.2 → pactkit-2.15.1}/docs/assets/logo.png +0 -0
  50. {pactkit-2.14.2 → pactkit-2.15.1}/docs/e2e/journey.md +0 -0
  51. {pactkit-2.14.2 → pactkit-2.15.1}/docs/guides/codex-integration-preresearch.md +0 -0
  52. {pactkit-2.14.2 → pactkit-2.15.1}/docs/guides/tool-integration-checklist.md +0 -0
  53. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202602.md +0 -0
  54. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202603.md +0 -0
  55. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202604.md +0 -0
  56. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/archive/archive_202605.md +0 -0
  57. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/friction-log.md +0 -0
  58. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/prd.md +0 -0
  59. {pactkit-2.14.2 → pactkit-2.15.1}/docs/product/sprint_board.md +0 -0
  60. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-001.md +0 -0
  61. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-002.md +0 -0
  62. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-003.md +0 -0
  63. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-004.md +0 -0
  64. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-005.md +0 -0
  65. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-006.md +0 -0
  66. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-007.md +0 -0
  67. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-008.md +0 -0
  68. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-009.md +0 -0
  69. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-010.md +0 -0
  70. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-011.md +0 -0
  71. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-012.md +0 -0
  72. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-013.md +0 -0
  73. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-014.md +0 -0
  74. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-015.md +0 -0
  75. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-016.md +0 -0
  76. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-017.md +0 -0
  77. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-018.md +0 -0
  78. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-019.md +0 -0
  79. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-020.md +0 -0
  80. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-021.md +0 -0
  81. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-022.md +0 -0
  82. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-023.md +0 -0
  83. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-024.md +0 -0
  84. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-025.md +0 -0
  85. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-026.md +0 -0
  86. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-027.md +0 -0
  87. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-028.md +0 -0
  88. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-029.md +0 -0
  89. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-030.md +0 -0
  90. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-031.md +0 -0
  91. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-032.md +0 -0
  92. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-033.md +0 -0
  93. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-034.md +0 -0
  94. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-035.md +0 -0
  95. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-001.md +0 -0
  96. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-002.md +0 -0
  97. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-003.md +0 -0
  98. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-004.md +0 -0
  99. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-005.md +0 -0
  100. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-006.md +0 -0
  101. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-089.md +0 -0
  102. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/BUG-slim-107.md +0 -0
  103. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-023.md +0 -0
  104. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-049.md +0 -0
  105. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-050.md +0 -0
  106. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-051.md +0 -0
  107. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-052.md +0 -0
  108. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-061.md +0 -0
  109. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-062.md +0 -0
  110. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-067.md +0 -0
  111. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-069.md +0 -0
  112. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-070.md +0 -0
  113. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-085.md +0 -0
  114. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-087.md +0 -0
  115. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-096.md +0 -0
  116. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-099.md +0 -0
  117. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-107.md +0 -0
  118. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-117.md +0 -0
  119. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-122.md +0 -0
  120. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-123.md +0 -0
  121. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-126.md +0 -0
  122. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/HOTFIX-slim-127.md +0 -0
  123. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-001.md +0 -0
  124. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-002.md +0 -0
  125. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-003.md +0 -0
  126. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-004.md +0 -0
  127. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-005.md +0 -0
  128. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-006.md +0 -0
  129. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-007.md +0 -0
  130. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-008.md +0 -0
  131. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-009.md +0 -0
  132. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-010.md +0 -0
  133. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-011.md +0 -0
  134. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-012.md +0 -0
  135. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-013.md +0 -0
  136. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-014.md +0 -0
  137. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-015.md +0 -0
  138. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-016.md +0 -0
  139. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-017.md +0 -0
  140. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-018.md +0 -0
  141. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-019.md +0 -0
  142. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-020.md +0 -0
  143. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-021.md +0 -0
  144. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-022.md +0 -0
  145. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-023.md +0 -0
  146. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-024.md +0 -0
  147. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-025.md +0 -0
  148. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-026.md +0 -0
  149. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-027.md +0 -0
  150. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-028.md +0 -0
  151. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-029.md +0 -0
  152. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-030.md +0 -0
  153. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-031.md +0 -0
  154. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-032.md +0 -0
  155. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-033.md +0 -0
  156. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-034.md +0 -0
  157. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-035.md +0 -0
  158. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-036.md +0 -0
  159. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-037.md +0 -0
  160. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-038.md +0 -0
  161. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-039.md +0 -0
  162. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-040.md +0 -0
  163. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-041.md +0 -0
  164. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-042.md +0 -0
  165. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-043.md +0 -0
  166. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-044.md +0 -0
  167. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-045.md +0 -0
  168. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-046.md +0 -0
  169. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-047.md +0 -0
  170. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-048.md +0 -0
  171. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-049.md +0 -0
  172. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-050.md +0 -0
  173. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-051.md +0 -0
  174. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-052.md +0 -0
  175. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-053.md +0 -0
  176. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-054.md +0 -0
  177. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-055.md +0 -0
  178. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-056.md +0 -0
  179. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-057.md +0 -0
  180. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-058.md +0 -0
  181. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-059.md +0 -0
  182. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-060.md +0 -0
  183. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-061.md +0 -0
  184. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-062.md +0 -0
  185. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-063.md +0 -0
  186. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-064.md +0 -0
  187. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-065.md +0 -0
  188. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-069.md +0 -0
  189. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-070.md +0 -0
  190. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-071.md +0 -0
  191. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-072.md +0 -0
  192. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-073.md +0 -0
  193. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-001.md +0 -0
  194. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-005.md +0 -0
  195. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-006.md +0 -0
  196. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-007.md +0 -0
  197. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-009.md +0 -0
  198. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-010.md +0 -0
  199. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-011.md +0 -0
  200. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-012.md +0 -0
  201. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-013.md +0 -0
  202. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-014.md +0 -0
  203. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-015.md +0 -0
  204. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-016.md +0 -0
  205. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-017.md +0 -0
  206. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-018.md +0 -0
  207. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-019.md +0 -0
  208. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-020.md +0 -0
  209. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-021.md +0 -0
  210. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-022.md +0 -0
  211. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-023.md +0 -0
  212. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-024.md +0 -0
  213. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-028.md +0 -0
  214. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-029.md +0 -0
  215. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-030.md +0 -0
  216. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-031.md +0 -0
  217. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-032.md +0 -0
  218. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-033.md +0 -0
  219. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-034.md +0 -0
  220. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-035.md +0 -0
  221. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-036.md +0 -0
  222. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-037.md +0 -0
  223. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-038.md +0 -0
  224. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-039.md +0 -0
  225. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-040.md +0 -0
  226. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-041.md +0 -0
  227. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-042.md +0 -0
  228. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-043.md +0 -0
  229. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-044.md +0 -0
  230. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-045.md +0 -0
  231. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-046.md +0 -0
  232. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-047.md +0 -0
  233. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-048.md +0 -0
  234. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-049.md +0 -0
  235. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-050.md +0 -0
  236. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-051.md +0 -0
  237. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-052.md +0 -0
  238. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-053.md +0 -0
  239. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-054.md +0 -0
  240. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-055.md +0 -0
  241. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-056.md +0 -0
  242. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-057.md +0 -0
  243. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-058.md +0 -0
  244. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-059.md +0 -0
  245. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-060.md +0 -0
  246. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-063.md +0 -0
  247. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-066.md +0 -0
  248. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-067.md +0 -0
  249. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-068.md +0 -0
  250. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-069.md +0 -0
  251. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-070.md +0 -0
  252. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-071.md +0 -0
  253. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-072.md +0 -0
  254. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-073.md +0 -0
  255. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-074.md +0 -0
  256. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-075.md +0 -0
  257. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-076.md +0 -0
  258. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-077.md +0 -0
  259. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-078.md +0 -0
  260. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-079.md +0 -0
  261. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-080.md +0 -0
  262. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-081.md +0 -0
  263. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-082.md +0 -0
  264. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-083.md +0 -0
  265. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-084.md +0 -0
  266. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-086.md +0 -0
  267. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-088.md +0 -0
  268. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-089.md +0 -0
  269. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-090.md +0 -0
  270. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-091.md +0 -0
  271. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-092.md +0 -0
  272. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-093.md +0 -0
  273. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-094.md +0 -0
  274. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-095.md +0 -0
  275. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-097.md +0 -0
  276. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-098.md +0 -0
  277. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-099.md +0 -0
  278. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-100.md +0 -0
  279. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-101.md +0 -0
  280. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-102.md +0 -0
  281. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-103.md +0 -0
  282. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-104.md +0 -0
  283. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-105.md +0 -0
  284. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-106.md +0 -0
  285. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-107.md +0 -0
  286. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-108.md +0 -0
  287. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-109.md +0 -0
  288. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-110.md +0 -0
  289. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-111.md +0 -0
  290. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-112.md +0 -0
  291. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-113.md +0 -0
  292. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-114.md +0 -0
  293. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-115.md +0 -0
  294. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-116.md +0 -0
  295. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-118.md +0 -0
  296. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-119.md +0 -0
  297. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-120.md +0 -0
  298. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-121.md +0 -0
  299. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-124.md +0 -0
  300. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-125.md +0 -0
  301. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-126.md +0 -0
  302. {pactkit-2.14.2 → pactkit-2.15.1}/docs/specs/STORY-slim-127.md +0 -0
  303. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/BUG-001_case.md +0 -0
  304. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/BUG-002_case.md +0 -0
  305. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-028_case.md +0 -0
  306. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-029_case.md +0 -0
  307. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-031_case.md +0 -0
  308. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-032_case.md +0 -0
  309. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-033_case.md +0 -0
  310. {pactkit-2.14.2 → pactkit-2.15.1}/docs/test_cases/STORY-slim-034_case.md +0 -0
  311. {pactkit-2.14.2 → pactkit-2.15.1}/opencode.json +0 -0
  312. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/__main__.py +0 -0
  313. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/audit.py +0 -0
  314. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/backfill.py +0 -0
  315. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/cleaners.py +0 -0
  316. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/cli.py +0 -0
  317. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/context_gen.py +0 -0
  318. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/coverage_gate.py +0 -0
  319. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/doctor.py +0 -0
  320. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/garden.py +0 -0
  321. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/__init__.py +0 -0
  322. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/generators/adapter.py +0 -0
  323. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/guards.py +0 -0
  324. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/id_generator.py +0 -0
  325. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/invariants.py +0 -0
  326. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/issue_sync.py +0 -0
  327. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/lazy_visualize.py +0 -0
  328. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/lessons.py +0 -0
  329. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/lint_runner.py +0 -0
  330. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/observe.py +0 -0
  331. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/profiles.py +0 -0
  332. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/__init__.py +0 -0
  333. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/agents.py +0 -0
  334. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/references.py +0 -0
  335. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/skills.py +0 -0
  336. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/prompts/workflows.py +0 -0
  337. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/regression.py +0 -0
  338. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/scripts.py +0 -0
  339. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/sec_scope.py +0 -0
  340. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/__init__.py +0 -0
  341. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/__init__.py +0 -0
  342. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  343. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  344. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  345. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  346. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/board.py +0 -0
  347. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/interface_summary.py +0 -0
  348. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/report.py +0 -0
  349. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/scaffold.py +0 -0
  350. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/skills/visualize.py +0 -0
  351. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/spec_status.py +0 -0
  352. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/test_mapper.py +0 -0
  353. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/utils.py +0 -0
  354. {pactkit-2.14.2 → pactkit-2.15.1}/src/pactkit/validators.py +0 -0
  355. {pactkit-2.14.2 → pactkit-2.15.1}/tests/conftest.py +0 -0
  356. {pactkit-2.14.2 → pactkit-2.15.1}/tests/e2e/__init__.py +0 -0
  357. {pactkit-2.14.2 → pactkit-2.15.1}/tests/e2e/cli/__init__.py +0 -0
  358. {pactkit-2.14.2 → pactkit-2.15.1}/tests/e2e/cli/test_cli_e2e.py +0 -0
  359. {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  360. {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  361. {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  362. {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  363. {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  364. {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  365. {pactkit-2.14.2 → pactkit-2.15.1}/tests/fixtures/api_call_parser/page.tsx +0 -0
  366. {pactkit-2.14.2 → pactkit-2.15.1}/tests/integration/__init__.py +0 -0
  367. {pactkit-2.14.2 → pactkit-2.15.1}/tests/integration/test_deploy_classic.py +0 -0
  368. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_agent_features.py +0 -0
  369. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_agent_frontmatter.py +0 -0
  370. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_agents_enrichment.py +0 -0
  371. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_audit.py +0 -0
  372. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_blast_radius.py +0 -0
  373. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_board_bug027.py +0 -0
  374. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_board_sections.py +0 -0
  375. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug001_skill_path.py +0 -0
  376. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug002_plugin_paths.py +0 -0
  377. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug003_multi_import.py +0 -0
  378. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug004_dead_set.py +0 -0
  379. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug005_archive_taskless.py +0 -0
  380. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug006_scan_excludes.py +0 -0
  381. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  382. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  383. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  384. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  385. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug011_stale_refs.py +0 -0
  386. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  387. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug013_config_single_source.py +0 -0
  388. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug014_version_hygiene.py +0 -0
  389. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  390. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  391. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug019_venv_deployment.py +0 -0
  392. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  393. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug025_release_delegation.py +0 -0
  394. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug026_version_sync.py +0 -0
  395. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug028_ghost_refs.py +0 -0
  396. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  397. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  398. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  399. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  400. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_021.py +0 -0
  401. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_022.py +0 -0
  402. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_023.py +0 -0
  403. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_024.py +0 -0
  404. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  405. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  406. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim003.py +0 -0
  407. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim004.py +0 -0
  408. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim005.py +0 -0
  409. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim006.py +0 -0
  410. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  411. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_check_command.py +0 -0
  412. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_check_extensions_072_073.py +0 -0
  413. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_check_playbook_072_073.py +0 -0
  414. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_command_frontmatter.py +0 -0
  415. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_command_visualize_modes.py +0 -0
  416. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_complexity.py +0 -0
  417. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_config_auto_merge.py +0 -0
  418. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_constitution_sharpening.py +0 -0
  419. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_context_gen.py +0 -0
  420. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_create_skill.py +0 -0
  421. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_cross_flow_matrix.py +0 -0
  422. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_deploy_base.py +0 -0
  423. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_deployer_cleanup.py +0 -0
  424. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_deployer_plugin.py +0 -0
  425. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_design_command.py +0 -0
  426. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_done_gates.py +0 -0
  427. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_draw_prompt.py +0 -0
  428. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_draw_references.py +0 -0
  429. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_drawio_mcp.py +0 -0
  430. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_garden.py +0 -0
  431. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_home_path_fix.py +0 -0
  432. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_hotfix_command.py +0 -0
  433. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_init_guard.py +0 -0
  434. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_init_playbook_074.py +0 -0
  435. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_interface_summary.py +0 -0
  436. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_lang_profiles.py +0 -0
  437. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_layer_violations.py +0 -0
  438. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_lessons_rotation_075.py +0 -0
  439. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_list_stories.py +0 -0
  440. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_mcp_integration.py +0 -0
  441. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_model_config.py +0 -0
  442. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_modular_constitution.py +0 -0
  443. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_monorepo_detect.py +0 -0
  444. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_multi_prefix.py +0 -0
  445. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_observe.py +0 -0
  446. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_pdca_slim.py +0 -0
  447. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_profiles.py +0 -0
  448. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_project_visibility.py +0 -0
  449. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompt_cli_refs.py +0 -0
  450. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompt_quality_075.py +0 -0
  451. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_prompts_package.py +0 -0
  452. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_release.py +0 -0
  453. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_release_field.py +0 -0
  454. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_release_v110.py +0 -0
  455. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_render_prompt.py +0 -0
  456. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_report_parser.py +0 -0
  457. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_report_unified.py +0 -0
  458. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_review_command.py +0 -0
  459. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_rules_enrichment.py +0 -0
  460. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_scaffold.py +0 -0
  461. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  462. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_schemas.py +0 -0
  463. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_script_extraction.py +0 -0
  464. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_session_context.py +0 -0
  465. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_skill_structure.py +0 -0
  466. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_skills_enrichment.py +0 -0
  467. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_slim_deps_088.py +0 -0
  468. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_smart_regression.py +0 -0
  469. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_solution_design_rule.py +0 -0
  470. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_sprint_command.py +0 -0
  471. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_stack_references.py +0 -0
  472. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_status_command.py +0 -0
  473. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_statusline.py +0 -0
  474. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story014_release.py +0 -0
  475. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  476. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story016_claude_md.py +0 -0
  477. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story017_init_claude_md.py +0 -0
  478. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story018_arch_staleness.py +0 -0
  479. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story019_bailout.py +0 -0
  480. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story020_horizon.py +0 -0
  481. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story021_rfc.py +0 -0
  482. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story022_decision_tree.py +0 -0
  483. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story023_test_quality.py +0 -0
  484. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story024_native_agent.py +0 -0
  485. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story025_ci_pipeline.py +0 -0
  486. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story026_issue_tracker.py +0 -0
  487. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story028_rule_scoping.py +0 -0
  488. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story029_doctor.py +0 -0
  489. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story030_lint.py +0 -0
  490. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story031_git_init_guard.py +0 -0
  491. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  492. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story033_config_backfill.py +0 -0
  493. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  494. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story035_readme_docs.py +0 -0
  495. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story037_regression_fix.py +0 -0
  496. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story038_call_graph_update.py +0 -0
  497. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story039_venv_config.py +0 -0
  498. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story040_layered_claude_md.py +0 -0
  499. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story043_active_clarify.py +0 -0
  500. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story044_consistency_check.py +0 -0
  501. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story045_auto_pr.py +0 -0
  502. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story046_agent_adapter.py +0 -0
  503. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story047_enterprise_flags.py +0 -0
  504. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story048_worktree_isolation.py +0 -0
  505. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story049_community_standards.py +0 -0
  506. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  507. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  508. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story052_conditional_github_release.py +0 -0
  509. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story053_impact_regression.py +0 -0
  510. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story055_commands.py +0 -0
  511. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story055_config.py +0 -0
  512. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story055_spec_linter.py +0 -0
  513. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story056_commands.py +0 -0
  514. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story056_config.py +0 -0
  515. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  516. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story058_opencode_extraction.py +0 -0
  517. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story058_routing_fix.py +0 -0
  518. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story059_codex_removal.py +0 -0
  519. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story060_init_hang.py +0 -0
  520. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story061_remove_thinking.py +0 -0
  521. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  522. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story064_venv_local_md.py +0 -0
  523. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story065_sprint_model.py +0 -0
  524. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story072_developer_prefix.py +0 -0
  525. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story106_lateral_scan.py +0 -0
  526. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  527. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim012_ci.py +0 -0
  528. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_clean.py +0 -0
  529. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_context.py +0 -0
  530. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_guard.py +0 -0
  531. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  532. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_next_id.py +0 -0
  533. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_regression.py +0 -0
  534. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  535. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim014_validators.py +0 -0
  536. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim015_doctor.py +0 -0
  537. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  538. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim017.py +0 -0
  539. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim018.py +0 -0
  540. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  541. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  542. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim022.py +0 -0
  543. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim023.py +0 -0
  544. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim024.py +0 -0
  545. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim025.py +0 -0
  546. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim027.py +0 -0
  547. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim028.py +0 -0
  548. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim029.py +0 -0
  549. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim030.py +0 -0
  550. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim031.py +0 -0
  551. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim035.py +0 -0
  552. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim036.py +0 -0
  553. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim037.py +0 -0
  554. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim038.py +0 -0
  555. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim039.py +0 -0
  556. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim040.py +0 -0
  557. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim041.py +0 -0
  558. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim042.py +0 -0
  559. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim043.py +0 -0
  560. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim044.py +0 -0
  561. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim045.py +0 -0
  562. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim046.py +0 -0
  563. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim047.py +0 -0
  564. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim048.py +0 -0
  565. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim049.py +0 -0
  566. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim051.py +0 -0
  567. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim052.py +0 -0
  568. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim053.py +0 -0
  569. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim054.py +0 -0
  570. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim055.py +0 -0
  571. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim056.py +0 -0
  572. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  573. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim063.py +0 -0
  574. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim065.py +0 -0
  575. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim076_multistack.py +0 -0
  576. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  577. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim078.py +0 -0
  578. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim079.py +0 -0
  579. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim080.py +0 -0
  580. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim081.py +0 -0
  581. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim082.py +0 -0
  582. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim083.py +0 -0
  583. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim084.py +0 -0
  584. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim095.py +0 -0
  585. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  586. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  587. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim102_version_marker.py +0 -0
  588. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim104_should_semantics.py +0 -0
  589. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim107.py +0 -0
  590. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim109_journey_spec.py +0 -0
  591. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
  592. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim114_journey_sync.py +0 -0
  593. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim119.py +0 -0
  594. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim120.py +0 -0
  595. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim121.py +0 -0
  596. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim125.py +0 -0
  597. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim126.py +0 -0
  598. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_story_slim127_managed_block.py +0 -0
  599. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_tools.py +0 -0
  600. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_topology_parsers_066.py +0 -0
  601. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_update_task.py +0 -0
  602. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_call_nested.py +0 -0
  603. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_chain_fix.py +0 -0
  604. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_modes.py +0 -0
  605. {pactkit-2.14.2 → pactkit-2.15.1}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -4,6 +4,25 @@ 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.1] - 2026-06-10
8
+
9
+ ### Added
10
+ - **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.
11
+ - **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.
12
+
13
+ ### Fixed
14
+ - **Spec linter** — Accept heading format for Security Scope `SEC-*` entries.
15
+ - **CI** — Remove obsolete `.opencode/pactkit.yaml` test.
16
+
17
+ ## [2.15.0] - 2026-06-04
18
+
19
+ ### Added
20
+ - **`lint` optional dependency group** — `pip install pactkit[lint]` now includes `ruff>=0.4`. The `all` extra also includes `lint`. Users no longer need to install ruff separately for the lint gate to work.
21
+ - **External tools documentation** — README and pactkit.dev installation pages now document recommended external tools (gh, codegraph) with install commands and fallback behavior.
22
+
23
+ ### Fixed
24
+ - **CI: tree-sitter tests skip when not installed** — `test_story_slim032`, `test_story_slim033`, `test_story_slim034` now use `pytest.importorskip("tree_sitter")` so they skip gracefully in CI environments without the `visualize` extra.
25
+
7
26
  ## [2.14.2] - 2026-06-01
8
27
 
9
28
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.14.2
3
+ Version: 2.15.1
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
@@ -25,12 +25,15 @@ Requires-Dist: pyyaml>=6.0
25
25
  Provides-Extra: all
26
26
  Requires-Dist: pactkit-codex>=2.9.0; extra == 'all'
27
27
  Requires-Dist: pactkit-opencode>=2.9.0; extra == 'all'
28
+ Requires-Dist: ruff>=0.4; extra == 'all'
28
29
  Requires-Dist: tree-sitter-go>=0.25; extra == 'all'
29
30
  Requires-Dist: tree-sitter-java>=0.23; extra == 'all'
30
31
  Requires-Dist: tree-sitter-typescript>=0.23; extra == 'all'
31
32
  Requires-Dist: tree-sitter>=0.25; extra == 'all'
32
33
  Provides-Extra: codex
33
34
  Requires-Dist: pactkit-codex>=2.9.0; extra == 'codex'
35
+ Provides-Extra: lint
36
+ Requires-Dist: ruff>=0.4; extra == 'lint'
34
37
  Provides-Extra: opencode
35
38
  Requires-Dist: pactkit-opencode>=2.9.0; extra == 'opencode'
36
39
  Provides-Extra: visualize
@@ -117,6 +120,23 @@ Requires Python 3.10+ and one of:
117
120
 
118
121
  > `pip install pactkit` automatically installs adapters for all 3 IDEs.
119
122
 
123
+ ### Optional Extras
124
+
125
+ ```bash
126
+ pip install pactkit[lint] # Includes ruff for lint gate
127
+ pip install pactkit[visualize] # Includes tree-sitter for AST analysis
128
+ pip install pactkit[all] # Everything above + IDE adapters
129
+ ```
130
+
131
+ ### Recommended External Tools
132
+
133
+ These tools enhance PactKit but cannot be distributed via pip:
134
+
135
+ | Tool | Purpose | Install |
136
+ |------|---------|---------|
137
+ | [gh](https://cli.github.com) | GitHub CLI (issue sync, release, PR) | `brew install gh` |
138
+ | [codegraph](https://www.npmjs.com/package/codegraph) | Code symbol index & call chain analysis | `npm install -g codegraph` |
139
+
120
140
  ## Quick Start
121
141
 
122
142
  ```bash
@@ -75,6 +75,23 @@ Requires Python 3.10+ and one of:
75
75
 
76
76
  > `pip install pactkit` automatically installs adapters for all 3 IDEs.
77
77
 
78
+ ### Optional Extras
79
+
80
+ ```bash
81
+ pip install pactkit[lint] # Includes ruff for lint gate
82
+ pip install pactkit[visualize] # Includes tree-sitter for AST analysis
83
+ pip install pactkit[all] # Everything above + IDE adapters
84
+ ```
85
+
86
+ ### Recommended External Tools
87
+
88
+ These tools enhance PactKit but cannot be distributed via pip:
89
+
90
+ | Tool | Purpose | Install |
91
+ |------|---------|---------|
92
+ | [gh](https://cli.github.com) | GitHub CLI (issue sync, release, PR) | `brew install gh` |
93
+ | [codegraph](https://www.npmjs.com/package/codegraph) | Code symbol index & call chain analysis | `npm install -g codegraph` |
94
+
78
95
  ## Quick Start
79
96
 
80
97
  ```bash
@@ -63,3 +63,4 @@
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 |
@@ -2,7 +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
5
  | 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
6
  | 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
7
  | 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 |
@@ -53,3 +52,4 @@
53
52
  | 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
53
  | 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
54
  | 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 |
55
+ | 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 |
@@ -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 4023+ 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
@@ -1,5 +1,5 @@
1
1
  # Project Context (Auto-generated)
2
- > Last updated: 2026-06-01T11:05:34+08:00 by pactkit context
2
+ > Last updated: 2026-06-10T11:17:05+08:00 by pactkit context
3
3
 
4
4
  ## Sprint Status
5
5
  Backlog: 3 | In Progress: 0 | Done: 0 stories
@@ -16,11 +16,11 @@ None
16
16
  * main
17
17
 
18
18
  ## Key Decisions
19
- - When SCAN_EXCLUDES is a module-level constant shared across graph modes, add mode-specific exclusion logic at the call site rather than modifying the constant — pass call_extra_excludes = SCAN_EXCLUDES - {'tests'} only for call mode to avoid affecting file/class modes
20
19
  - _write_sqlite_db reuses func_registry and rel_edges already in memory from _build_call_graph — no second AST scan; pactkit query reads db directly without touching pactkit.yaml
21
20
  - 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
22
21
  - codegraph sync must be enforced by code (pactkit visualize/sync), not by prompt instructions — prompt-only enforcement is unreliable for deterministic operations
23
22
  - 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
23
+ - 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.
24
24
 
25
25
  ## Next Recommended Action
26
26
  `/project-plan`
@@ -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)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pactkit"
7
- version = "2.14.2"
7
+ version = "2.15.1"
8
8
  description = "Spec-driven agentic DevOps toolkit for AI coding assistants"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -62,8 +62,11 @@ visualize = [
62
62
  "tree-sitter-java>=0.23",
63
63
  "tree-sitter-typescript>=0.23",
64
64
  ]
65
+ lint = [
66
+ "ruff>=0.4",
67
+ ]
65
68
  all = [
66
- "pactkit[opencode,codex,visualize]",
69
+ "pactkit[opencode,codex,visualize,lint]",
67
70
  ]
68
71
 
69
72
  [tool.hatch.build.targets.wheel]
@@ -1,3 +1,3 @@
1
1
  """PactKit - Spec-driven agentic DevOps toolkit."""
2
2
 
3
- __version__ = "2.14.2"
3
+ __version__ = "2.15.1"
@@ -85,6 +85,7 @@ VALID_RULES = frozenset(
85
85
  "04-architecture-principles",
86
86
  "05-sectional-write",
87
87
  "06-solution-design",
88
+ "07-engineering-concerns",
88
89
  }
89
90
  )
90
91
 
@@ -153,6 +153,12 @@ class DeployerBase:
153
153
  config=config, _legacy_prefix=_legacy_prefix,
154
154
  )
155
155
 
156
+ @staticmethod
157
+ def deploy_guides(claude_root, profile=None):
158
+ from pactkit.generators.deployer import _deploy_guides
159
+
160
+ return _deploy_guides(claude_root, profile=profile)
161
+
156
162
  @staticmethod
157
163
  def deploy_ci(provider, project_root, config):
158
164
  from pactkit.generators.deployer import _deploy_ci
@@ -84,6 +84,8 @@ def _render_prompt(template: str, profile: FormatProfile) -> str:
84
84
  "SCAFFOLD_CMD": f"python3 {skills_root}/pactkit-scaffold/scripts/scaffold.py",
85
85
  "REPORT_CMD": f"python3 {skills_root}/pactkit-report/scripts/report.py",
86
86
  "GLOBAL_INSTRUCTIONS": f"{profile.global_config_dir}/{profile.global_instructions_file}",
87
+ # Engineering guides path (STORY-slim-128)
88
+ "GUIDES_PATH": f"{skills_root}/_rules/guides",
87
89
  # Document schema variables (STORY-slim-007)
88
90
  "CONTEXT_SECTIONS": CONTEXT_SECTIONS_TEXT,
89
91
  "LESSONS_ROW_FORMAT": LESSONS_ROW_FORMAT,
@@ -357,6 +359,7 @@ def _deploy_classic(config=None, target=None):
357
359
  _cleanup_legacy(skills_dir)
358
360
  rule_scopes = config.get("rule_scopes", {})
359
361
  n_rules = _deploy_rules(claude_root, enabled_rules, rule_scopes=rule_scopes, profile=classic_profile)
362
+ _deploy_guides(claude_root, profile=classic_profile)
360
363
  _deploy_claude_md(claude_root, enabled_rules)
361
364
  agent_models = config.get("agent_models", {})
362
365
  n_agents = _deploy_agents(agents_dir, enabled_agents, profile=classic_profile, agent_models=agent_models)
@@ -676,6 +679,32 @@ def _deploy_rules(claude_root, enabled_rules, rule_scopes=None, profile=None):
676
679
  return deployed
677
680
 
678
681
 
682
+ def _deploy_guides(claude_root, profile=None):
683
+ """Deploy engineering guide files to skills/_rules/guides/ (STORY-slim-128).
684
+
685
+ Guides are on-demand reference files loaded by Act Phase 1.5 based on
686
+ Spec's engineering concerns. Not loaded into context unless explicitly read.
687
+ """
688
+ from pactkit.prompts.guides import GUIDES_DIR, GUIDES_FILES
689
+
690
+ guides_dir = claude_root / "skills" / prompts.RULES_ONDEMAND_DIR / GUIDES_DIR
691
+ guides_dir.mkdir(parents=True, exist_ok=True)
692
+
693
+ # Clean existing managed guide files (upgrade path)
694
+ for f in guides_dir.glob("*.md"):
695
+ if f.name in GUIDES_FILES:
696
+ f.unlink()
697
+
698
+ deployed = 0
699
+ for filename, content in GUIDES_FILES.items():
700
+ if profile is not None:
701
+ content = _render_prompt(content, profile)
702
+ atomic_write(guides_dir / filename, content)
703
+ deployed += 1
704
+
705
+ return deployed
706
+
707
+
679
708
  def _is_pactkit_managed_global_md(content):
680
709
  """Detect if CLAUDE.md content is a PactKit-managed template (BUG-slim-089).
681
710
 
@@ -104,7 +104,12 @@ model: opus
104
104
  ## 🎬 Phase 2: Design & Impact
105
105
  1. **Diff**: Compare User Request vs Current Reality (from Phase 1).
106
106
  2. **Duplication Audit**: Run the Duplication Audit from system-architect protocol — if this is the Nth same-kind implementation, grep existing implementations and assess shared abstraction needs before writing Spec.
107
- 3. **Update HLD**: Modify `docs/architecture/graphs/system_design.mmd`.
107
+ 3. **Engineering Concerns Assessment** — scan the requirement for NFR keywords:
108
+ - Reference the Engineering Concerns trigger index (`07-engineering-concerns.md`) keyword table.
109
+ - For each matched concern, the Spec's Technical Design MUST include a decision (e.g., concurrency model, timeout strategy, caching policy).
110
+ - Unmatched concerns → do not add (avoid noise).
111
+ - **Output checkpoint**: `"Engineering concerns identified: {list}. Decisions will be included in Technical Design."`
112
+ 4. **Update HLD**: Modify `docs/architecture/graphs/system_design.mmd`.
108
113
  - *Rule*: Keep the `code_graph.mmd` as is (it updates automatically).
109
114
 
110
115
  ## 🎬 Phase 3.1: Story ID Generation
@@ -217,7 +222,18 @@ model: sonnet
217
222
  - For **agent**: Check AgentParser output for orchestration edges so new code doesn't break agent flow.
218
223
  5. **Solution Design Protocol (Conditional)** — if the implementation involves frameworks already used by the project:
219
224
  - Execute the **Solution Design Protocol** from `06-solution-design.md` to evaluate capability delta before writing code.
220
- - Output brief capability assessment before proceeding to Phase 2.
225
+ - Output brief capability assessment before proceeding to Phase 1.5.
226
+
227
+ ## 🔧 Phase 1.5: Engineering Concerns Loading (Conditional)
228
+ > **PURPOSE**: Load only the NFR guides relevant to this Story — keeps context minimal while ensuring engineering rigor.
229
+ 1. **Read Spec Technical Design**: Check if the Spec contains engineering concern decisions (from Plan Phase 2).
230
+ 2. **Identify concerns**: Extract the concern keywords mentioned (e.g., database, api-integration, resilience).
231
+ 3. **Load guides**: For each identified concern, read the corresponding guide file from `{GUIDES_PATH}/`:
232
+ - MUST load only 1-3 relevant guides (those matching the Spec's concerns).
233
+ - NEVER load all 13 guides.
234
+ - If Spec has no engineering concerns section, skip this phase silently.
235
+ 4. **Apply constraints**: Use the loaded guides' MUST/NEVER rules as implementation constraints in Phase 3.
236
+ 5. **Output checkpoint**: `"Engineering guides loaded: {list}. Applying as implementation constraints."`
221
237
 
222
238
  ## 🎬 Phase 2: Test Scaffolding (TDD)
223
239
  1. **Constraint**: NEVER write source code in this phase — doing so breaks TDD causality: tests must exist before the code they verify.