pactkit 2.12.0__tar.gz → 2.13.0__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 (577) hide show
  1. {pactkit-2.12.0 → pactkit-2.13.0}/.github/workflows/pactkit.yml +1 -1
  2. {pactkit-2.12.0 → pactkit-2.13.0}/CHANGELOG.md +7 -0
  3. {pactkit-2.12.0 → pactkit-2.13.0}/PKG-INFO +1 -1
  4. {pactkit-2.12.0 → pactkit-2.13.0}/docs/architecture/governance/archive/lessons_archive_202603.md +8 -0
  5. {pactkit-2.12.0 → pactkit-2.13.0}/docs/architecture/governance/lessons.md +2 -8
  6. {pactkit-2.12.0 → pactkit-2.13.0}/docs/architecture/governance/rules.md +1 -1
  7. pactkit-2.12.0/docs/product/sprint_board.md → pactkit-2.13.0/docs/product/archive/archive_202605.md +18 -10
  8. {pactkit-2.12.0 → pactkit-2.13.0}/docs/product/context.md +6 -8
  9. pactkit-2.13.0/docs/product/sprint_board.md +8 -0
  10. pactkit-2.13.0/docs/specs/STORY-slim-113.md +175 -0
  11. pactkit-2.13.0/docs/specs/STORY-slim-114.md +158 -0
  12. {pactkit-2.12.0 → pactkit-2.13.0}/pyproject.toml +1 -1
  13. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/__init__.py +1 -1
  14. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/cli.py +12 -0
  15. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/prompts/commands.py +29 -4
  16. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/prompts/skills.py +6 -10
  17. pactkit-2.13.0/src/pactkit/skills/interface_summary.py +199 -0
  18. pactkit-2.13.0/tests/unit/test_interface_summary.py +207 -0
  19. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story063_prompt_slimming.py +3 -1
  20. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim026.py +2 -2
  21. pactkit-2.13.0/tests/unit/test_story_slim114_journey_sync.py +130 -0
  22. {pactkit-2.12.0 → pactkit-2.13.0}/.github/workflows/publish.yml +0 -0
  23. {pactkit-2.12.0 → pactkit-2.13.0}/.gitignore +0 -0
  24. {pactkit-2.12.0 → pactkit-2.13.0}/.opencode/pactkit.yaml +0 -0
  25. {pactkit-2.12.0 → pactkit-2.13.0}/AGENTS.md +0 -0
  26. {pactkit-2.12.0 → pactkit-2.13.0}/CODE_OF_CONDUCT.md +0 -0
  27. {pactkit-2.12.0 → pactkit-2.13.0}/CONTRIBUTING.md +0 -0
  28. {pactkit-2.12.0 → pactkit-2.13.0}/LICENSE +0 -0
  29. {pactkit-2.12.0 → pactkit-2.13.0}/README.md +0 -0
  30. {pactkit-2.12.0 → pactkit-2.13.0}/SECURITY.md +0 -0
  31. {pactkit-2.12.0 → pactkit-2.13.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  32. {pactkit-2.12.0 → pactkit-2.13.0}/docs/architecture/governance/harness_audit.json +0 -0
  33. {pactkit-2.12.0 → pactkit-2.13.0}/docs/architecture/governance/philosophy.md +0 -0
  34. {pactkit-2.12.0 → pactkit-2.13.0}/docs/assets/logo.png +0 -0
  35. {pactkit-2.12.0 → pactkit-2.13.0}/docs/e2e/journey.md +0 -0
  36. {pactkit-2.12.0 → pactkit-2.13.0}/docs/guides/codex-integration-preresearch.md +0 -0
  37. {pactkit-2.12.0 → pactkit-2.13.0}/docs/guides/tool-integration-checklist.md +0 -0
  38. {pactkit-2.12.0 → pactkit-2.13.0}/docs/product/archive/archive_202602.md +0 -0
  39. {pactkit-2.12.0 → pactkit-2.13.0}/docs/product/archive/archive_202603.md +0 -0
  40. {pactkit-2.12.0 → pactkit-2.13.0}/docs/product/archive/archive_202604.md +0 -0
  41. {pactkit-2.12.0 → pactkit-2.13.0}/docs/product/friction-log.md +0 -0
  42. {pactkit-2.12.0 → pactkit-2.13.0}/docs/product/prd.md +0 -0
  43. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-001.md +0 -0
  44. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-002.md +0 -0
  45. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-003.md +0 -0
  46. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-004.md +0 -0
  47. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-005.md +0 -0
  48. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-006.md +0 -0
  49. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-007.md +0 -0
  50. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-008.md +0 -0
  51. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-009.md +0 -0
  52. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-010.md +0 -0
  53. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-011.md +0 -0
  54. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-012.md +0 -0
  55. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-013.md +0 -0
  56. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-014.md +0 -0
  57. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-015.md +0 -0
  58. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-016.md +0 -0
  59. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-017.md +0 -0
  60. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-018.md +0 -0
  61. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-019.md +0 -0
  62. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-020.md +0 -0
  63. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-021.md +0 -0
  64. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-022.md +0 -0
  65. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-023.md +0 -0
  66. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-024.md +0 -0
  67. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-025.md +0 -0
  68. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-026.md +0 -0
  69. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-027.md +0 -0
  70. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-028.md +0 -0
  71. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-029.md +0 -0
  72. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-030.md +0 -0
  73. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-031.md +0 -0
  74. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-032.md +0 -0
  75. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-033.md +0 -0
  76. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-034.md +0 -0
  77. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-035.md +0 -0
  78. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-001.md +0 -0
  79. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-002.md +0 -0
  80. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-003.md +0 -0
  81. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-004.md +0 -0
  82. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-005.md +0 -0
  83. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-006.md +0 -0
  84. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-089.md +0 -0
  85. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/BUG-slim-107.md +0 -0
  86. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-023.md +0 -0
  87. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-049.md +0 -0
  88. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-050.md +0 -0
  89. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-051.md +0 -0
  90. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-052.md +0 -0
  91. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-061.md +0 -0
  92. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-062.md +0 -0
  93. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-067.md +0 -0
  94. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-069.md +0 -0
  95. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-070.md +0 -0
  96. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-085.md +0 -0
  97. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-087.md +0 -0
  98. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-096.md +0 -0
  99. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-099.md +0 -0
  100. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/HOTFIX-slim-107.md +0 -0
  101. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-001.md +0 -0
  102. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-002.md +0 -0
  103. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-003.md +0 -0
  104. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-004.md +0 -0
  105. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-005.md +0 -0
  106. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-006.md +0 -0
  107. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-007.md +0 -0
  108. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-008.md +0 -0
  109. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-009.md +0 -0
  110. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-010.md +0 -0
  111. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-011.md +0 -0
  112. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-012.md +0 -0
  113. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-013.md +0 -0
  114. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-014.md +0 -0
  115. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-015.md +0 -0
  116. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-016.md +0 -0
  117. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-017.md +0 -0
  118. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-018.md +0 -0
  119. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-019.md +0 -0
  120. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-020.md +0 -0
  121. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-021.md +0 -0
  122. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-022.md +0 -0
  123. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-023.md +0 -0
  124. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-024.md +0 -0
  125. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-025.md +0 -0
  126. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-026.md +0 -0
  127. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-027.md +0 -0
  128. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-028.md +0 -0
  129. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-029.md +0 -0
  130. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-030.md +0 -0
  131. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-031.md +0 -0
  132. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-032.md +0 -0
  133. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-033.md +0 -0
  134. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-034.md +0 -0
  135. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-035.md +0 -0
  136. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-036.md +0 -0
  137. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-037.md +0 -0
  138. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-038.md +0 -0
  139. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-039.md +0 -0
  140. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-040.md +0 -0
  141. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-041.md +0 -0
  142. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-042.md +0 -0
  143. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-043.md +0 -0
  144. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-044.md +0 -0
  145. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-045.md +0 -0
  146. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-046.md +0 -0
  147. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-047.md +0 -0
  148. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-048.md +0 -0
  149. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-049.md +0 -0
  150. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-050.md +0 -0
  151. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-051.md +0 -0
  152. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-052.md +0 -0
  153. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-053.md +0 -0
  154. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-054.md +0 -0
  155. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-055.md +0 -0
  156. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-056.md +0 -0
  157. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-057.md +0 -0
  158. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-058.md +0 -0
  159. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-059.md +0 -0
  160. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-060.md +0 -0
  161. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-061.md +0 -0
  162. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-062.md +0 -0
  163. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-063.md +0 -0
  164. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-064.md +0 -0
  165. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-065.md +0 -0
  166. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-069.md +0 -0
  167. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-070.md +0 -0
  168. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-071.md +0 -0
  169. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-072.md +0 -0
  170. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-073.md +0 -0
  171. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-001.md +0 -0
  172. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-005.md +0 -0
  173. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-006.md +0 -0
  174. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-007.md +0 -0
  175. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-009.md +0 -0
  176. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-010.md +0 -0
  177. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-011.md +0 -0
  178. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-012.md +0 -0
  179. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-013.md +0 -0
  180. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-014.md +0 -0
  181. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-015.md +0 -0
  182. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-016.md +0 -0
  183. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-017.md +0 -0
  184. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-018.md +0 -0
  185. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-019.md +0 -0
  186. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-020.md +0 -0
  187. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-021.md +0 -0
  188. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-022.md +0 -0
  189. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-023.md +0 -0
  190. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-024.md +0 -0
  191. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-028.md +0 -0
  192. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-029.md +0 -0
  193. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-030.md +0 -0
  194. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-031.md +0 -0
  195. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-032.md +0 -0
  196. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-033.md +0 -0
  197. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-034.md +0 -0
  198. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-035.md +0 -0
  199. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-036.md +0 -0
  200. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-037.md +0 -0
  201. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-038.md +0 -0
  202. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-039.md +0 -0
  203. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-040.md +0 -0
  204. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-041.md +0 -0
  205. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-042.md +0 -0
  206. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-043.md +0 -0
  207. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-044.md +0 -0
  208. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-045.md +0 -0
  209. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-046.md +0 -0
  210. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-047.md +0 -0
  211. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-048.md +0 -0
  212. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-049.md +0 -0
  213. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-050.md +0 -0
  214. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-051.md +0 -0
  215. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-052.md +0 -0
  216. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-053.md +0 -0
  217. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-054.md +0 -0
  218. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-055.md +0 -0
  219. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-056.md +0 -0
  220. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-057.md +0 -0
  221. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-058.md +0 -0
  222. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-059.md +0 -0
  223. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-060.md +0 -0
  224. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-063.md +0 -0
  225. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-066.md +0 -0
  226. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-067.md +0 -0
  227. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-068.md +0 -0
  228. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-069.md +0 -0
  229. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-070.md +0 -0
  230. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-071.md +0 -0
  231. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-072.md +0 -0
  232. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-073.md +0 -0
  233. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-074.md +0 -0
  234. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-075.md +0 -0
  235. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-076.md +0 -0
  236. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-077.md +0 -0
  237. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-078.md +0 -0
  238. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-079.md +0 -0
  239. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-080.md +0 -0
  240. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-081.md +0 -0
  241. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-082.md +0 -0
  242. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-083.md +0 -0
  243. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-084.md +0 -0
  244. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-086.md +0 -0
  245. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-088.md +0 -0
  246. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-089.md +0 -0
  247. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-090.md +0 -0
  248. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-091.md +0 -0
  249. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-092.md +0 -0
  250. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-093.md +0 -0
  251. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-094.md +0 -0
  252. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-095.md +0 -0
  253. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-097.md +0 -0
  254. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-098.md +0 -0
  255. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-099.md +0 -0
  256. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-100.md +0 -0
  257. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-101.md +0 -0
  258. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-102.md +0 -0
  259. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-103.md +0 -0
  260. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-104.md +0 -0
  261. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-105.md +0 -0
  262. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-106.md +0 -0
  263. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-107.md +0 -0
  264. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-108.md +0 -0
  265. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-109.md +0 -0
  266. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-110.md +0 -0
  267. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-111.md +0 -0
  268. {pactkit-2.12.0 → pactkit-2.13.0}/docs/specs/STORY-slim-112.md +0 -0
  269. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/BUG-001_case.md +0 -0
  270. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/BUG-002_case.md +0 -0
  271. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
  272. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
  273. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
  274. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
  275. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
  276. {pactkit-2.12.0 → pactkit-2.13.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
  277. {pactkit-2.12.0 → pactkit-2.13.0}/opencode.json +0 -0
  278. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/__main__.py +0 -0
  279. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/audit.py +0 -0
  280. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/backfill.py +0 -0
  281. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/cleaners.py +0 -0
  282. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/config.py +0 -0
  283. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/context_gen.py +0 -0
  284. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/coverage_gate.py +0 -0
  285. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/doctor.py +0 -0
  286. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/garden.py +0 -0
  287. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/generators/__init__.py +0 -0
  288. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/generators/adapter.py +0 -0
  289. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/generators/deploy_base.py +0 -0
  290. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/generators/deployer.py +0 -0
  291. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/guards.py +0 -0
  292. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/id_generator.py +0 -0
  293. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/invariants.py +0 -0
  294. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/issue_sync.py +0 -0
  295. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/lazy_visualize.py +0 -0
  296. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/lessons.py +0 -0
  297. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/lint_runner.py +0 -0
  298. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/observe.py +0 -0
  299. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/profiles.py +0 -0
  300. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/prompts/__init__.py +0 -0
  301. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/prompts/agents.py +0 -0
  302. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/prompts/references.py +0 -0
  303. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/prompts/rules.py +0 -0
  304. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/prompts/workflows.py +0 -0
  305. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/regression.py +0 -0
  306. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/schemas.py +0 -0
  307. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/scripts.py +0 -0
  308. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/sec_scope.py +0 -0
  309. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/__init__.py +0 -0
  310. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
  311. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  312. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  313. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  314. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  315. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/board.py +0 -0
  316. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/report.py +0 -0
  317. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/scaffold.py +0 -0
  318. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/spec_linter.py +0 -0
  319. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/skills/visualize.py +0 -0
  320. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/spec_status.py +0 -0
  321. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/test_mapper.py +0 -0
  322. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/utils.py +0 -0
  323. {pactkit-2.12.0 → pactkit-2.13.0}/src/pactkit/validators.py +0 -0
  324. {pactkit-2.12.0 → pactkit-2.13.0}/tests/conftest.py +0 -0
  325. {pactkit-2.12.0 → pactkit-2.13.0}/tests/e2e/__init__.py +0 -0
  326. {pactkit-2.12.0 → pactkit-2.13.0}/tests/e2e/cli/__init__.py +0 -0
  327. {pactkit-2.12.0 → pactkit-2.13.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
  328. {pactkit-2.12.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  329. {pactkit-2.12.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  330. {pactkit-2.12.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  331. {pactkit-2.12.0 → pactkit-2.13.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  332. {pactkit-2.12.0 → pactkit-2.13.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  333. {pactkit-2.12.0 → pactkit-2.13.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  334. {pactkit-2.12.0 → pactkit-2.13.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
  335. {pactkit-2.12.0 → pactkit-2.13.0}/tests/integration/__init__.py +0 -0
  336. {pactkit-2.12.0 → pactkit-2.13.0}/tests/integration/test_deploy_classic.py +0 -0
  337. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_agent_features.py +0 -0
  338. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_agent_frontmatter.py +0 -0
  339. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_agents_enrichment.py +0 -0
  340. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_audit.py +0 -0
  341. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_blast_radius.py +0 -0
  342. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_board_bug027.py +0 -0
  343. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_board_sections.py +0 -0
  344. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug001_skill_path.py +0 -0
  345. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
  346. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug003_multi_import.py +0 -0
  347. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug004_dead_set.py +0 -0
  348. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
  349. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
  350. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  351. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  352. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  353. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  354. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug011_stale_refs.py +0 -0
  355. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  356. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug013_config_single_source.py +0 -0
  357. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
  358. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  359. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  360. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
  361. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  362. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug025_release_delegation.py +0 -0
  363. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug026_version_sync.py +0 -0
  364. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
  365. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  366. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  367. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  368. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  369. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_021.py +0 -0
  370. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_022.py +0 -0
  371. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_023.py +0 -0
  372. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_024.py +0 -0
  373. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  374. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  375. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_slim003.py +0 -0
  376. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_slim004.py +0 -0
  377. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_slim005.py +0 -0
  378. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_slim006.py +0 -0
  379. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  380. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_check_command.py +0 -0
  381. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_check_extensions_072_073.py +0 -0
  382. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_check_playbook_072_073.py +0 -0
  383. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_command_frontmatter.py +0 -0
  384. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_command_visualize_modes.py +0 -0
  385. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_complexity.py +0 -0
  386. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_config.py +0 -0
  387. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_config_auto_merge.py +0 -0
  388. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_constitution_sharpening.py +0 -0
  389. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_context_gen.py +0 -0
  390. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_create_skill.py +0 -0
  391. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_cross_flow_matrix.py +0 -0
  392. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_deploy_base.py +0 -0
  393. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_deployer_cleanup.py +0 -0
  394. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_deployer_plugin.py +0 -0
  395. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_design_command.py +0 -0
  396. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_done_gates.py +0 -0
  397. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_draw_prompt.py +0 -0
  398. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_draw_references.py +0 -0
  399. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_drawio_mcp.py +0 -0
  400. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_garden.py +0 -0
  401. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_home_path_fix.py +0 -0
  402. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_hotfix_command.py +0 -0
  403. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_init_guard.py +0 -0
  404. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_init_playbook_074.py +0 -0
  405. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_lang_profiles.py +0 -0
  406. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_layer_violations.py +0 -0
  407. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_lessons_rotation_075.py +0 -0
  408. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_list_stories.py +0 -0
  409. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_mcp_integration.py +0 -0
  410. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_model_config.py +0 -0
  411. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_modular_constitution.py +0 -0
  412. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_monorepo_detect.py +0 -0
  413. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_multi_prefix.py +0 -0
  414. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_observe.py +0 -0
  415. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_pdca_slim.py +0 -0
  416. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_profiles.py +0 -0
  417. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_project_visibility.py +0 -0
  418. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_prompt_cli_refs.py +0 -0
  419. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_prompt_quality_075.py +0 -0
  420. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
  421. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_prompts_package.py +0 -0
  422. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_release.py +0 -0
  423. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_release_field.py +0 -0
  424. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_release_v110.py +0 -0
  425. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_render_prompt.py +0 -0
  426. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_report_parser.py +0 -0
  427. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_report_unified.py +0 -0
  428. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_review_command.py +0 -0
  429. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_rules_enrichment.py +0 -0
  430. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_scaffold.py +0 -0
  431. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  432. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_schemas.py +0 -0
  433. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_script_extraction.py +0 -0
  434. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_selective_deploy.py +0 -0
  435. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_session_context.py +0 -0
  436. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_skill_structure.py +0 -0
  437. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_skills_enrichment.py +0 -0
  438. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_slim_deps_088.py +0 -0
  439. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_smart_regression.py +0 -0
  440. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_solution_design_rule.py +0 -0
  441. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_sprint_command.py +0 -0
  442. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_stack_references.py +0 -0
  443. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_status_command.py +0 -0
  444. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_statusline.py +0 -0
  445. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story014_release.py +0 -0
  446. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  447. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story016_claude_md.py +0 -0
  448. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story017_init_claude_md.py +0 -0
  449. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story018_arch_staleness.py +0 -0
  450. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story019_bailout.py +0 -0
  451. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story020_horizon.py +0 -0
  452. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story021_rfc.py +0 -0
  453. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story022_decision_tree.py +0 -0
  454. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story023_test_quality.py +0 -0
  455. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story024_native_agent.py +0 -0
  456. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
  457. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story026_issue_tracker.py +0 -0
  458. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story028_rule_scoping.py +0 -0
  459. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story029_doctor.py +0 -0
  460. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story030_lint.py +0 -0
  461. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story031_git_init_guard.py +0 -0
  462. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  463. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story033_config_backfill.py +0 -0
  464. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  465. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story035_readme_docs.py +0 -0
  466. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story037_regression_fix.py +0 -0
  467. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story038_call_graph_update.py +0 -0
  468. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story039_venv_config.py +0 -0
  469. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
  470. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story042_spec_linter.py +0 -0
  471. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story043_active_clarify.py +0 -0
  472. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story044_consistency_check.py +0 -0
  473. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story045_auto_pr.py +0 -0
  474. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story046_agent_adapter.py +0 -0
  475. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
  476. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
  477. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story049_community_standards.py +0 -0
  478. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  479. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  480. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
  481. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story053_impact_regression.py +0 -0
  482. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story055_commands.py +0 -0
  483. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story055_config.py +0 -0
  484. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story055_spec_linter.py +0 -0
  485. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story056_commands.py +0 -0
  486. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story056_config.py +0 -0
  487. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  488. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
  489. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story058_routing_fix.py +0 -0
  490. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story059_codex_removal.py +0 -0
  491. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story060_init_hang.py +0 -0
  492. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story061_remove_thinking.py +0 -0
  493. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  494. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story064_venv_local_md.py +0 -0
  495. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story065_sprint_model.py +0 -0
  496. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story072_developer_prefix.py +0 -0
  497. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story106_lateral_scan.py +0 -0
  498. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  499. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  500. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim011_command_rules.py +0 -0
  501. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim012_ci.py +0 -0
  502. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_clean.py +0 -0
  503. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_context.py +0 -0
  504. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_guard.py +0 -0
  505. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  506. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_next_id.py +0 -0
  507. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_regression.py +0 -0
  508. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  509. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim014_validators.py +0 -0
  510. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim015_doctor.py +0 -0
  511. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  512. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim017.py +0 -0
  513. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim018.py +0 -0
  514. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  515. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  516. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim021.py +0 -0
  517. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim022.py +0 -0
  518. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim023.py +0 -0
  519. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim024.py +0 -0
  520. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim025.py +0 -0
  521. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim027.py +0 -0
  522. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim028.py +0 -0
  523. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim029.py +0 -0
  524. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim030.py +0 -0
  525. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim031.py +0 -0
  526. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim032.py +0 -0
  527. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim033.py +0 -0
  528. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim034.py +0 -0
  529. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim035.py +0 -0
  530. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim036.py +0 -0
  531. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim037.py +0 -0
  532. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim038.py +0 -0
  533. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim039.py +0 -0
  534. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim040.py +0 -0
  535. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim041.py +0 -0
  536. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim042.py +0 -0
  537. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim043.py +0 -0
  538. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim044.py +0 -0
  539. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim045.py +0 -0
  540. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim046.py +0 -0
  541. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim047.py +0 -0
  542. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim048.py +0 -0
  543. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim049.py +0 -0
  544. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim051.py +0 -0
  545. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim052.py +0 -0
  546. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim053.py +0 -0
  547. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim054.py +0 -0
  548. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim055.py +0 -0
  549. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim056.py +0 -0
  550. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  551. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim063.py +0 -0
  552. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim065.py +0 -0
  553. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim076_multistack.py +0 -0
  554. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  555. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim078.py +0 -0
  556. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim079.py +0 -0
  557. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim080.py +0 -0
  558. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim081.py +0 -0
  559. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim082.py +0 -0
  560. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim083.py +0 -0
  561. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim084.py +0 -0
  562. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim095.py +0 -0
  563. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  564. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  565. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
  566. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
  567. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim107.py +0 -0
  568. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
  569. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
  570. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
  571. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_tools.py +0 -0
  572. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_topology_parsers_066.py +0 -0
  573. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_update_task.py +0 -0
  574. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_visualize_call_nested.py +0 -0
  575. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_visualize_chain_fix.py +0 -0
  576. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_visualize_modes.py +0 -0
  577. {pactkit-2.12.0 → pactkit-2.13.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -20,7 +20,7 @@ jobs:
20
20
  - name: Install dependencies
21
21
  run: |
22
22
  python -m pip install --upgrade pip
23
- pip install -e .
23
+ pip install -e ".[visualize]"
24
24
  pip install pytest ruff
25
25
  pactkit init
26
26
 
@@ -4,6 +4,13 @@ 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.13.0] - 2026-05-07
8
+
9
+ ### Added
10
+ - **`pactkit interface-summary` CLI** (STORY-slim-113) — AST-based interface extraction that physically outputs only signatures, types, and docstrings. Enforces "Code Enforces, Prompt Instructs" for Act Phase 1 layered loading — AI receives truncated content by design.
11
+ - **Journey Sync in Act Phase 4** (STORY-slim-114) — Conditional step that updates `docs/e2e/journey.md` when a Story modifies journey-relevant steps. Closes the create→consume→update lifecycle gap.
12
+ - **Journey Segment in Plan Phase 3.2a** (STORY-slim-114) — Conditional Spec annotation that links Stories to journey steps, enabling Act Phase 4 auto-detection.
13
+
7
14
  ## [2.12.0] - 2026-05-06
8
15
 
9
16
  ### Changed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.12.0
3
+ Version: 2.13.0
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
@@ -54,3 +54,11 @@
54
54
  | 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
55
55
  | 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
56
56
  | 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
57
+ | 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
58
+ | 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
59
+ | 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
60
+ | 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
61
+ | 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
62
+ | 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
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
+ | 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 |
@@ -2,14 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
6
- | 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
7
- | 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
8
- | 2026-03-26 | Helpers added to visualize.py standalone header get stripped by load_script(); always place new functions below the SCRIPT BODY marker | visualize.py:_mermaid_escape |
9
- | 2026-03-26 | dict.pop() in shared config references causes caller mutation; use .get() for read-only access to avoid breaking multi-call scenarios | deployer.py:_deploy_ci |
10
- | 2026-03-26 | _atomic_mmd_write() in visualize.py prevents truncated .mmd on crash via tmp+rename; all 4 write sites converted | visualize.py:_atomic_mmd_write |
11
- | 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 |
12
- | 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 |
13
5
  | 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 |
14
6
  | 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 |
15
7
  | 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 |
@@ -54,3 +46,5 @@
54
46
  | 2026-04-24 | Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI | commands.py:Plan_Phase_1 |
55
47
  | 2026-04-24 | When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior | board.py:update_version |
56
48
  | 2026-04-27 | When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase | rules.py:RULES_MODULES |
49
+ | 2026-05-07 | Code Enforces implementation: pactkit interface-summary uses ast.parse() to physically output only signatures—AI receives truncated content, not a prompt instruction to self-truncate. Pattern: CLI tool as enforcement layer (interface_summary.py:generate_summary) | src/pactkit/skills/interface_summary.py:generate_summary |
50
+ | 2026-05-07 | Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md'] | src/pactkit/prompts/commands.py:COMMANDS_CONTENT |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3841+ tests must pass before any commit to `main`.
18
+ 1. All 3937+ 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`.
@@ -1,19 +1,20 @@
1
- # Sprint Board
2
1
 
3
- ## 📋 Backlog
2
+ ### [STORY-slim-113] pactkit interface-summary CLI — Code Enforce 接口摘要
3
+ > Spec: docs/specs/STORY-slim-113.md
4
4
 
5
+ - [x] 新建 interface_summary.py 提取逻辑
6
+ - [x] CLI 注册 interface-summary 命令
7
+ - [x] Act Phase 1 改为显式步骤
8
+ - [x] pactkit-trace 更新输出指引
9
+ - [x] 单元测试
5
10
 
6
11
  ### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
7
12
  > Spec: docs/specs/STORY-slim-112.md
8
13
 
9
- - [ ] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
10
- - [ ] 更新 deployer 双目录部署
11
- - [ ] 更新所有 skill @import 路径
12
- - [ ] 更新测试断言
13
-
14
- ## 🔄 In Progress
15
-
16
- ## ✅ Done
14
+ - [x] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
15
+ - [x] 更新 deployer 双目录部署
16
+ - [x] 更新所有 skill @import 路径
17
+ - [x] 更新测试断言
17
18
 
18
19
  ### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
19
20
  > Spec: docs/specs/STORY-slim-111.md
@@ -37,3 +38,10 @@
37
38
 
38
39
  - [x] 修改 pactkit-trace SKILL.md Phase 3
39
40
  - [x] 修改 project-act SKILL.md Phase 1
41
+
42
+ ### [STORY-slim-114] Act Phase 4 Journey Sync — journey.md 维护闭环
43
+ > Spec: docs/specs/STORY-slim-114.md
44
+
45
+ - [x] Act Phase 4 新增 Journey Sync 步骤
46
+ - [x] Plan Phase 3.2a 条件 Journey Segment
47
+ - [x] 单元测试
@@ -1,16 +1,14 @@
1
1
  # Project Context (Auto-generated)
2
- > Last updated: 2026-05-06T14:08:28+08:00 by pactkit context
2
+ > Last updated: 2026-05-07T10:33:00+08:00 by pactkit context
3
3
 
4
4
  ## Sprint Status
5
- Backlog: 1 | In Progress: 0 | Done: 4 stories
5
+ Backlog: 0 | In Progress: 0 | Done: 0 stories
6
6
 
7
7
  ## Current Stories
8
8
  None
9
9
 
10
10
  ## Recent Completions
11
- - STORY-slim-110: project-design 集成 User Journey 生成
12
- - STORY-slim-109: E2E journey.md 规范定义与 File Atlas 集成
13
- - STORY-slim-108: pactkit-trace --summary 模式:接口摘要输出
11
+ None
14
12
 
15
13
  ## Active Branches
16
14
  + claude/naughty-euclid-e6a787
@@ -18,14 +16,14 @@ None
18
16
  * main
19
17
 
20
18
  ## Key Decisions
21
- - Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act
22
- - Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly
23
19
  - Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI
24
20
  - When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior
25
21
  - When extracting project-specific rules into a framework, generalize by removing project names, library references, and spec IDs — keep only the anti-pattern/fix-pattern structure that applies to any codebase
22
+ - Code Enforces implementation: pactkit interface-summary uses ast.parse() to physically output only signatures—AI receives truncated content, not a prompt instruction to self-truncate. Pattern: CLI tool as enforcement layer (interface_summary.py:generate_summary)
23
+ - Lifecycle gap pattern: when artifact has create+consume but no update mechanism, add conditional sync in the modifying command. Applied: Act Phase 4 Journey Sync step in commands.py COMMANDS_CONTENT['project-act.md']
26
24
 
27
25
  ## Next Recommended Action
28
- `/project-plan`
26
+ `/project-design`
29
27
 
30
28
  ## Agent Continuation
31
29
  No active work session.
@@ -0,0 +1,8 @@
1
+ # Sprint Board
2
+
3
+ ## 📋 Backlog
4
+
5
+ ## 🔄 In Progress
6
+
7
+ ## ✅ Done
8
+
@@ -0,0 +1,175 @@
1
+ # STORY-slim-113: pactkit interface-summary CLI — Code Enforce 接口摘要
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-113 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+ | Release | 2.13.0 |
9
+
10
+ ## Background
11
+
12
+ ### 问题
13
+
14
+ STORY-slim-108 引入了"接口摘要"概念——Act Phase 1 对 trace 发现的非目标模块只读签名+docstring。但当前实现**完全依赖 Prompt 指导**(pactkit-trace SKILL.md 的 "Layered Output" 表格 + Act Phase 1.2 的一句 "Layered Loading"),AI 实际执行时仍然直接 Read 完整文件,因为:
15
+
16
+ 1. 没有工具约束——AI 调用 Read 工具时没有 `--summary-only` 限制
17
+ 2. 一句文字指导不足以改变 AI 的默认行为
18
+ 3. 违反了 PactKit 自己的 "Code Enforces, Prompt Instructs" 原则(架构原则 §10)
19
+
20
+ ### 方案
21
+
22
+ 新增 `pactkit interface-summary <file>` CLI 命令:
23
+ - 基于现有 `python_analyzer.py` 的 AST 能力(已有 `extract_classes`、`extract_functions_and_calls`)
24
+ - 输出经代码裁剪的接口摘要,AI 拿到的物理上就是精简内容
25
+ - Act Phase 1 改为**显式步骤**:对非目标模块调用此 CLI 而非 Read
26
+
27
+ ### 为什么不用 hook
28
+
29
+ 用户明确要求不使用 hook。本方案通过 CLI 输出 + playbook 步骤变更来实现 Code Enforce,无需 harness 层面的文件拦截。
30
+
31
+ ## Requirements
32
+
33
+ ### R1: 新增 `pactkit interface-summary` CLI 命令 (MUST)
34
+
35
+ 新增子命令接受一个或多个文件路径,输出接口摘要:
36
+
37
+ ```
38
+ pactkit interface-summary src/pactkit/generators/deployer.py
39
+ ```
40
+
41
+ 输出格式(per file):
42
+ ```
43
+ # deployer.py — Interface Summary
44
+
45
+ class ClassicDeployer(BaseDeployer):
46
+ """Deploy PactKit to ~/.claude/ (Classic format)."""
47
+ +deploy(target, config) -> DeployResult
48
+ +_deploy_rules(claude_root, enabled_rules) -> None
49
+ +_deploy_skills(claude_root, enabled_skills) -> None
50
+ -_cleanup_legacy(target) -> None
51
+
52
+ def atomic_write(path: Path, content: str) -> None:
53
+ """Write content atomically via tempfile + rename."""
54
+
55
+ def _render_prompt(template: str, profile: FormatProfile) -> str:
56
+ """Replace placeholders with profile-specific values."""
57
+ ```
58
+
59
+ 提取规则:
60
+ - **Class**: class name + bases + docstring 第一行 + public/private methods with signature
61
+ - **Function**: def name + params with type hints + return type + docstring 第一行
62
+ - **Skip**: 函数体、局部变量、内部逻辑
63
+ - **Constants/Enums**: 顶层 `UPPER_CASE` 赋值保留名称和类型
64
+
65
+ ### R2: 多语言支持通过 LANG_PROFILES 分派 (SHOULD)
66
+
67
+ 使用已有的 `LANG_PROFILES` + analyzer 架构:
68
+ - Python: `ast` 模块提取(已有基础设施)
69
+ - TypeScript: `tree_sitter_typescript` 提取 exported declarations
70
+ - Go: `tree_sitter_go` 提取 exported (大写) func/struct
71
+
72
+ 初始版本 MUST 支持 Python。TS/Go 为 SHOULD。
73
+
74
+ ### R3: Act Phase 1 增加显式步骤 (MUST)
75
+
76
+ 修改 `project-act/SKILL.md` Phase 1.2,从当前的一句指导:
77
+ > "Layered Loading: For non-target modules discovered by trace, read interface summary..."
78
+
79
+ 改为显式步骤:
80
+ ```
81
+ 2b. **Interface Summary** (for non-target modules):
82
+ - For each module discovered by trace that is NOT the modification target:
83
+ `pactkit interface-summary <file>`
84
+ - Only escalate to `Read <file>` when you confirm the module needs modification.
85
+ ```
86
+
87
+ ### R4: pactkit-trace SKILL.md 更新输出格式指引 (MUST)
88
+
89
+ 修改 pactkit-trace SKILL.md Phase 3 "Layered Output" 部分,从"建议 AI 自行精简"改为"调用 CLI 获取":
90
+
91
+ > For related (non-target) modules, run `pactkit interface-summary <file>` instead of reading full source.
92
+
93
+ ### R5: 不修改 Read 工具行为 (MUST NOT)
94
+
95
+ 本 story 不修改 Claude Code harness 的 Read 工具、不添加 hook、不拦截文件访问。通过提供更好的替代工具来引导行为,而非限制现有工具。
96
+
97
+ ## Acceptance Criteria
98
+
99
+ ### AC1: CLI 输出接口摘要 (R1)
100
+
101
+ - **Given** 一个 Python 文件 `src/pactkit/generators/deployer.py`(含多个 class 和函数)
102
+ - **When** 运行 `pactkit interface-summary src/pactkit/generators/deployer.py`
103
+ - **Then** 输出包含所有 class(带 bases 和 methods 签名)和顶层函数(带参数和返回类型),不包含函数体
104
+
105
+ ### AC2: 输出行数显著小于原文件 (R1)
106
+
107
+ - **Given** `deployer.py` 约 600+ 行
108
+ - **When** 运行 `pactkit interface-summary` 对其生成摘要
109
+ - **Then** 输出行数 ≤ 原文件行数的 25%(即 ≤ 150 行)
110
+
111
+ ### AC3: 多文件支持 (R1)
112
+
113
+ - **Given** 两个 Python 文件 A.py 和 B.py
114
+ - **When** 运行 `pactkit interface-summary A.py B.py`
115
+ - **Then** 输出两个文件的摘要,以 `# filename — Interface Summary` 分隔
116
+
117
+ ### AC4: Act Phase 1 步骤可验证 (R3)
118
+
119
+ - **Given** 修改后的 project-act SKILL.md
120
+ - **When** 读取 Phase 1 内容
121
+ - **Then** 存在显式编号步骤 "2b" 包含 `pactkit interface-summary` 命令
122
+
123
+ ### AC5: 非 Python 文件 graceful fallback (R2)
124
+
125
+ - **Given** 一个 .go 文件但 tree-sitter-go 未安装
126
+ - **When** 运行 `pactkit interface-summary file.go`
127
+ - **Then** 输出警告 "Unsupported or unavailable analyzer for .go" 并退出 0(不阻塞)
128
+
129
+ ## Target Call Chain
130
+
131
+ ```
132
+ pactkit interface-summary <files>
133
+ → cli.py: main() → parse args → _interface_summary_command(args)
134
+ → interface_summary.py: generate_summary(file_paths)
135
+ → detect language from extension
136
+ → LANG_PROFILES dispatch → python_analyzer / ts_analyzer / go_analyzer
137
+ → For Python:
138
+ → ast.parse(source)
139
+ → Extract: class defs (name, bases, docstring, method signatures)
140
+ → Extract: top-level functions (name, params, return type, docstring)
141
+ → Extract: top-level constants (UPPER_CASE assignments)
142
+ → Format output as structured text
143
+ → Print to stdout
144
+ ```
145
+
146
+ ## Implementation Steps
147
+
148
+ | Step | File | Action | Dependencies | Risk |
149
+ |------|------|--------|-------------|------|
150
+ | 1 | `src/pactkit/skills/interface_summary.py` | 新建:接口摘要提取逻辑,复用 python_analyzer AST 能力 | None | Medium |
151
+ | 2 | `src/pactkit/cli.py` | 注册 `interface-summary` 子命令 | Step 1 | Low |
152
+ | 3 | `~/.claude/skills/project-act/SKILL.md` (source: `src/pactkit/prompts/commands.py`) | Phase 1.2 → 1.2a + 1.2b 显式步骤 | Step 1-2 | Low |
153
+ | 4 | `~/.claude/skills/pactkit-trace/SKILL.md` (source: `src/pactkit/prompts/skills.py`) | Phase 3 Layered Output 改为 CLI 调用指引 | Step 1-2 | Low |
154
+ | 5 | `tests/unit/test_interface_summary.py` | 新建:单元测试覆盖 Python 文件摘要输出 | Step 1 | Low |
155
+
156
+ ## Security Scope
157
+
158
+ | Check | Applicable | Reason |
159
+ |-------|------------|--------|
160
+ | SEC-1 | No | 无秘钥变更 |
161
+ | SEC-2 | No | 输入为本地文件路径,已有 file_path.stat() 大小检查 |
162
+ | SEC-3 | No | 无数据库 |
163
+ | SEC-4 | No | 无 UI |
164
+ | SEC-5 | No | 无认证 |
165
+ | SEC-6 | No | 无接口暴露 |
166
+ | SEC-7 | No | CLI 输出,无敏感信息 |
167
+ | SEC-8 | No | 无新依赖(复用现有 ast + tree_sitter) |
168
+
169
+ ## Out of Scope
170
+
171
+ - 修改 Claude Code Read 工具行为
172
+ - Hook 机制
173
+ - 自动拦截 AI 的 Read 调用
174
+ - Java analyzer 支持(已有但不在本 story 优先级内)
175
+ - `pactkit trace` CLI 命令(本 story 只做 interface-summary,trace 仍是 skill)
@@ -0,0 +1,158 @@
1
+ # STORY-slim-114: Act Phase 4 Journey Sync — journey.md 维护闭环
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-114 |
6
+ | Status | Done |
7
+ | Priority | P2 |
8
+ | Release | 2.13.0 |
9
+
10
+ ## Background
11
+
12
+ ### 问题
13
+
14
+ STORY-slim-109 定义了 `docs/e2e/journey.md` 格式规范,STORY-slim-110 让 `/project-design` 自动生成 journey.md,STORY-slim-111 让 `/project-check` 消费 journey.md 来确定 E2E 范围。
15
+
16
+ 但**没有任何命令负责更新 journey.md**。当 `/project-act` 完成一个 story 并改变了用户流中的某个步骤时:
17
+ - journey.md 的步骤描述可能已过时
18
+ - 断言可能不再准确(新加了 UI 元素、改了 API schema)
19
+ - Check Phase 4 会基于 stale 的 journey 定义来确定 E2E 范围
20
+
21
+ 这是一个 **create → consume without update** 的生命周期缺口。
22
+
23
+ ### 方案
24
+
25
+ 在 Act Phase 4 增加条件步骤 "Journey Sync":
26
+ - 触发条件明确(journey.md 存在 + story 涉及旅程步骤)
27
+ - 行为轻量(读 + 判断 + 按需 Edit,不是全文重写)
28
+ - 无 hook,纯 playbook 步骤
29
+
30
+ ### 同时修复:Design 阶段 Journey Annotation
31
+
32
+ STORY-slim-110 的 Design Phase 2 已要求"annotate each Story's Spec with the journey segment it relates to",但这个标注没有标准格式。定义 annotation 格式使 Act Phase 4 能自动判断"当前 story 是否涉及 journey 步骤"。
33
+
34
+ ## Requirements
35
+
36
+ ### R1: Act Phase 4 新增 Journey Sync 步骤 (MUST)
37
+
38
+ 在 Act Phase 4 的 "Sync & Document" 中增加步骤(位于 visualize 之后、board update 之前):
39
+
40
+ ```markdown
41
+ 1b. **Journey Sync (Conditional)**:
42
+ - **Skip if**: `docs/e2e/journey.md` does not exist in the project
43
+ - **Skip if**: Current Story's Spec has no `## Journey Segment` section
44
+ - **If triggered**:
45
+ 1. Read `docs/e2e/journey.md`
46
+ 2. Locate the journey step(s) referenced in the Spec's `## Journey Segment`
47
+ 3. Review: do the step assertions still hold after this Story's code changes?
48
+ 4. If outdated: Edit the affected step(s) — update assertions, add new structure assertions, or adjust step description
49
+ 5. If still accurate: skip with log "Journey steps verified — no update needed"
50
+ ```
51
+
52
+ ### R2: Spec 标注格式定义 (MUST)
53
+
54
+ 定义 Spec 中标注 journey segment 的标准格式:
55
+
56
+ ```markdown
57
+ ## Journey Segment
58
+
59
+ - Journey: {Journey Name}
60
+ - Steps: {step numbers, e.g., "2-3" or "4"}
61
+ - Impact: {brief description of how this story affects the journey}
62
+ ```
63
+
64
+ 此 section 由 `/project-plan` Phase 3.2a 生成(如果 journey.md 存在),或由 `/project-design` Phase 2 自动添加。
65
+
66
+ ### R3: Plan Phase 3.2a 条件生成 Journey Segment section (SHOULD)
67
+
68
+ 修改 project-plan playbook 的 Phase 3.2a:
69
+ - **条件**: 如果项目有 `docs/e2e/journey.md`
70
+ - **行为**: 读 journey.md,判断当前 story 是否涉及某个 journey 的步骤,如果是则在 Spec 中添加 `## Journey Segment` section
71
+ - **不阻塞**: 如果不涉及任何 journey,不添加此 section(Act Phase 4 的 skip 条件自动生效)
72
+
73
+ ### R4: 不引入新的 CLI 命令 (MUST NOT)
74
+
75
+ Journey Sync 是 playbook 行为指导,不需要新的 CLI 工具。AI 通过 Read + Edit 操作 journey.md 即可。理由:journey.md 内容是自由格式的 markdown,不适合结构化工具处理。
76
+
77
+ ### R5: Merge over Replace 策略 (MUST)
78
+
79
+ Journey Sync 更新 journey.md 时 MUST 使用 Edit(增量修改),MUST NOT 使用 Write(全文覆盖)。journey.md 可能包含多个 journey,只改当前 story 涉及的步骤。
80
+
81
+ ## Acceptance Criteria
82
+
83
+ ### AC1: Journey Sync 在 Act Phase 4 存在 (R1)
84
+
85
+ - **Given** 修改后的 project-act SKILL.md
86
+ - **When** 读取 Phase 4 内容
87
+ - **Then** 存在步骤 "1b" 或 "Journey Sync" 标题,包含 skip 条件和触发行为
88
+
89
+ ### AC2: 无 journey.md 时静默跳过 (R1)
90
+
91
+ - **Given** 项目没有 `docs/e2e/journey.md`
92
+ - **When** Act Phase 4 执行到 Journey Sync
93
+ - **Then** 静默跳过,无报错
94
+
95
+ ### AC3: Spec 无 Journey Segment section 时跳过 (R1)
96
+
97
+ - **Given** 项目有 journey.md,但当前 Story 的 Spec 没有 `## Journey Segment`
98
+ - **When** Act Phase 4 执行到 Journey Sync
99
+ - **Then** 跳过,无更新
100
+
101
+ ### AC4: Story 涉及 journey 步骤时触发更新 (R1)
102
+
103
+ - **Given** 项目有 journey.md,Story Spec 有 `## Journey Segment` 标注 "Journey: First Login, Steps: 2-3"
104
+ - **When** Act Phase 4 执行 Journey Sync
105
+ - **Then** 读取 journey.md 中 "First Login" journey 的 Step 2-3,检查断言是否需更新
106
+
107
+ ### AC5: Spec scaffold 生成 Journey Segment (R2, R3)
108
+
109
+ - **Given** 项目有 `docs/e2e/journey.md` 定义了 3 个 journey
110
+ - **When** `/project-plan` 生成新 Spec
111
+ - **Then** Spec 中包含 `## Journey Segment` section(如果 story 涉及某个 journey)
112
+
113
+ ## Target Call Chain
114
+
115
+ ```
116
+ /project-act Phase 4:
117
+ → 1. pactkit visualize --lazy (existing)
118
+ → 1b. Journey Sync:
119
+ → Check: does docs/e2e/journey.md exist? (Bash: test -f)
120
+ → Check: does docs/specs/{ID}.md contain "## Journey Segment"? (grep)
121
+ → If both: Read journey.md → locate affected steps → Edit if outdated
122
+ → 2. Board update (existing)
123
+ → 3. Context update (existing)
124
+
125
+ /project-plan Phase 3.2a (conditional):
126
+ → Check: does docs/e2e/journey.md exist?
127
+ → If yes: Read journey.md → match story scope to journey steps → add ## Journey Segment to Spec
128
+ ```
129
+
130
+ ## Implementation Steps
131
+
132
+ | Step | File | Action | Dependencies | Risk |
133
+ |------|------|--------|-------------|------|
134
+ | 1 | `src/pactkit/prompts/commands.py` (act section) | Phase 4 新增 1b Journey Sync 步骤 | None | Low |
135
+ | 2 | `src/pactkit/prompts/commands.py` (plan section) | Phase 3.2a 增加条件 Journey Segment 生成 | None | Low |
136
+ | 3 | `src/pactkit/prompts/skills.py` (trace section) | 无变更(确认不冲突) | None | None |
137
+ | 4 | `tests/unit/test_story_slim114_journey_sync.py` | 验证 Act playbook 包含 Journey Sync 步骤文本 | Step 1 | Low |
138
+
139
+ ## Security Scope
140
+
141
+ | Check | Applicable | Reason |
142
+ |-------|------------|--------|
143
+ | SEC-1 | No | 无秘钥变更 |
144
+ | SEC-2 | No | 无外部输入处理 |
145
+ | SEC-3 | No | 无数据库 |
146
+ | SEC-4 | No | 无 UI |
147
+ | SEC-5 | No | 无认证 |
148
+ | SEC-6 | No | 无接口 |
149
+ | SEC-7 | No | 无错误输出 |
150
+ | SEC-8 | No | 无依赖变更 |
151
+
152
+ ## Out of Scope
153
+
154
+ - 新增 CLI 命令(journey.md 由 AI 通过 Read+Edit 操作)
155
+ - journey.md 的结构化 linter(内容是自由格式 markdown)
156
+ - Check Phase 4 修改(已由 STORY-slim-111 处理)
157
+ - Design Phase 1.5.5 修改(已由 STORY-slim-110 处理)
158
+ - 自动检测 journey 影响(需要 AI 判断力,不适合 Code Enforce)
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "pactkit"
7
- version = "2.12.0"
7
+ version = "2.13.0"
8
8
  description = "Spec-driven agentic DevOps toolkit for AI coding assistants"
9
9
  readme = "README.md"
10
10
  license = "MIT"
@@ -1,3 +1,3 @@
1
1
  """PactKit - Spec-driven agentic DevOps toolkit."""
2
2
 
3
- __version__ = "2.12.0"
3
+ __version__ = "2.13.0"
@@ -341,6 +341,10 @@ def main():
341
341
  spec_status_parser.add_argument("spec", help="Path to spec file")
342
342
  spec_status_parser.add_argument("status", choices=["Draft", "In Progress", "Done"], help="New status value")
343
343
 
344
+ # pactkit interface-summary (STORY-slim-113)
345
+ iface_parser = subparsers.add_parser("interface-summary", help="Output interface summary (signatures only)")
346
+ iface_parser.add_argument("files", nargs="+", help="Source file(s) to summarize")
347
+
344
348
  # pactkit redetect-stack (STORY-slim-077)
345
349
  subparsers.add_parser("redetect-stack", help="Re-detect project stacks and update pactkit.yaml")
346
350
 
@@ -738,6 +742,14 @@ def main():
738
742
  if result["action"] == "error":
739
743
  raise SystemExit(1)
740
744
 
745
+ elif args.command == "interface-summary":
746
+ from pathlib import Path
747
+
748
+ from pactkit.skills.interface_summary import generate_summary
749
+
750
+ paths = [Path(f) for f in args.files]
751
+ print(generate_summary(paths))
752
+
741
753
  elif args.command == "redetect-stack":
742
754
  from pathlib import Path
743
755
 
@@ -116,7 +116,19 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
116
116
  - Edit `(Description of the problem or feature)` → actual Background content from your Trace findings
117
117
  - Edit `## Target Call Chain` placeholder → actual call chain from Phase 1
118
118
  - Edit `### R1: (Requirement Name) (MUST)` → actual requirements using RFC 2119 keywords (MUST/SHOULD/MAY). Add more R{N} sections as needed.
119
- 4. **Output checkpoint**: Print "Spec skeleton filled. Adding acceptance criteria."
119
+ 4. **Journey Segment (Conditional)**: If `docs/e2e/journey.md` exists in the project:
120
+ - Read `docs/e2e/journey.md` to identify defined journeys and their steps.
121
+ - Assess whether this Story's scope touches any journey step (e.g., modifies a UI flow, changes an API endpoint used in a journey).
122
+ - If yes: add a `## Journey Segment` section to the Spec with the format:
123
+ ```
124
+ ## Journey Segment
125
+
126
+ - Journey: {Journey Name}
127
+ - Steps: {step numbers, e.g., "2-3" or "4"}
128
+ - Impact: {brief description of how this story affects the journey}
129
+ ```
130
+ - If the Story does not affect any journey: do NOT add this section (Act Phase 4 Journey Sync will auto-skip).
131
+ 5. **Output checkpoint**: Print "Spec skeleton filled. Adding acceptance criteria."
120
132
 
121
133
  ## 🎬 Phase 3.2b: Acceptance Criteria & Implementation Steps
122
134
  1. **Edit AC** (use Edit tool): Replace `### AC1: (Scenario Name) (R1)` and its Given/When/Then placeholders with actual scenarios. The template already provides the `- **Given**` / `- **When**` / `- **Then**` structure — fill in the content. Add more AC{N} sections as needed.
@@ -190,11 +202,15 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
190
202
  1. **Targeted Visual Scan**: Run `visualize --focus <module>` only (single targeted mode). For large codebases, add `--depth 2`. Do NOT run full 3-mode visualize here — that is handled by Phase 4 Lazy Visualize after implementation.
191
203
  2. **Trace Verification** — use pactkit-trace skill:
192
204
  - Before touching any code, confirm the call site and ensure you don't break existing callers.
193
- - **Layered Loading**: For non-target modules discovered by trace, read interface summary (signature + types + docstring) first. Only escalate to full source when modification is confirmed needed.
194
- 3. **Topology-Aware Trace (Conditional)** if `detect_topology(root)` includes `api_call` or `agent`:
205
+ 3. **Interface Summary (Code Enforce)** for non-target modules discovered by trace:
206
+ - Run `pactkit interface-summary <file>` for each related module you do NOT plan to modify.
207
+ - This outputs signatures + types + docstrings only (function bodies excluded by code).
208
+ - Only escalate to full `Read <file>` when you confirm the module needs modification.
209
+ - If `pactkit` is not on `$PATH`, use `python3 -m pactkit interface-summary <file>`.
210
+ 4. **Topology-Aware Trace (Conditional)** — if `detect_topology(root)` includes `api_call` or `agent`:
195
211
  - For **api_call**: Run `api_convention_summary(root)` to check API path prefixes and fetch function conventions. Use these conventions when writing new API calls to maintain consistency.
196
212
  - For **agent**: Check AgentParser output for orchestration edges so new code doesn't break agent flow.
197
- 4. **Solution Design Protocol (Conditional)** — if the implementation involves frameworks already used by the project:
213
+ 5. **Solution Design Protocol (Conditional)** — if the implementation involves frameworks already used by the project:
198
214
  - Execute the **Solution Design Protocol** from `06-solution-design.md` to evaluate capability delta before writing code.
199
215
  - Output brief capability assessment before proceeding to Phase 2.
200
216
 
@@ -225,6 +241,15 @@ allowed-tools: [Read, Write, Edit, Bash, Glob, Grep]
225
241
 
226
242
  ## 🎬 Phase 4: Sync & Document
227
243
  1. Run `pactkit clean` and `pactkit visualize --lazy` (runs file, `--mode class`, `--mode call` if source changed).
244
+ 1b. **Journey Sync (Conditional)**:
245
+ - **Skip if**: `docs/e2e/journey.md` does not exist in the project.
246
+ - **Skip if**: Current Story's Spec has no `## Journey Segment` section.
247
+ - **If triggered**:
248
+ 1. Read `docs/e2e/journey.md`
249
+ 2. Locate the journey step(s) referenced in the Spec's `## Journey Segment` (format: `- Journey: {Name}` / `- Steps: {N}` / `- Impact: {desc}`)
250
+ 3. Review: do the step assertions still hold after this Story's code changes?
251
+ 4. If outdated: Edit the affected step(s) in journey.md — update assertions, add new structure assertions, or adjust step description. MUST use Edit (incremental), MUST NOT use Write (full replace).
252
+ 5. If still accurate: skip with log "Journey steps verified — no update needed"
228
253
  2. **Update Board (CRITICAL)**: Run `{BOARD_CMD} update_task {STORY_ID} "Task Name"` for each completed task to mark it as `[x]`.
229
254
  3. **Update Continuation State**: Run `pactkit context --continuation --last-command "/project-act {STORY_ID}" --phase "Phase 4: complete"` to record the agent's stopping point for session handoff.
230
255
  4. **Coverage Table Output (STORY-slim-105)**: Output a coverage table listing each R{N} from the Spec:
@@ -256,18 +256,14 @@ Deep code analysis and execution path tracing via static analysis.
256
256
 
257
257
  #### Layered Output: Interface Summary vs Full Implementation
258
258
 
259
- | Module Role | Output Level | Content |
260
- |-------------|-------------|---------|
261
- | Target (to be modified) | Full implementation | Complete function bodies |
262
- | Related (dependency, not modified) | Interface summary | Signature + types + docstring only |
259
+ | Module Role | Output Level | How |
260
+ |-------------|-------------|-----|
261
+ | Target (to be modified) | Full implementation | `Read <file>` |
262
+ | Related (dependency, not modified) | Interface summary | `pactkit interface-summary <file>` |
263
263
 
264
- **Interface Summary Extraction by Language:**
264
+ For related (non-target) modules, run `pactkit interface-summary <file>` instead of reading full source. This CLI command uses AST parsing to output only signatures + types + docstrings — function bodies are excluded by code, not by prompt instruction.
265
265
 
266
- - **Python**: `def name(params) -> ReturnType:` + docstring + `@decorator` annotations
267
- - **TypeScript**: `export function/interface/type` declarations + JSDoc comments
268
- - **Go**: Exported `func Name(params) ReturnType` + struct definitions + godoc comment
269
-
270
- Interface summary is produced on-the-fly during trace output — no separate files are generated (DRY: avoid stale pre-generated artifacts).
266
+ If `pactkit` is not on `$PATH`, use `python3 -m pactkit interface-summary <file>`.
271
267
 
272
268
  ### 4. Visual Synthesis
273
269
  Output a **Mermaid Sequence Diagram** to visualize the flow.