pactkit 2.13.0__tar.gz → 2.14.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 (596) hide show
  1. pactkit-2.14.0/.codegraph/.gitignore +16 -0
  2. {pactkit-2.13.0 → pactkit-2.14.0}/.github/workflows/pactkit.yml +1 -1
  3. {pactkit-2.13.0 → pactkit-2.14.0}/.gitignore +3 -0
  4. {pactkit-2.13.0 → pactkit-2.14.0}/.opencode/pactkit.yaml +1 -0
  5. {pactkit-2.13.0 → pactkit-2.14.0}/CHANGELOG.md +21 -1
  6. {pactkit-2.13.0 → pactkit-2.14.0}/PKG-INFO +6 -4
  7. {pactkit-2.13.0 → pactkit-2.14.0}/README.md +5 -3
  8. {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/lessons.md +4 -0
  9. {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/rules.md +1 -1
  10. pactkit-2.14.0/docs/product/archive/archive_202605.md +109 -0
  11. pactkit-2.14.0/docs/product/context.md +29 -0
  12. pactkit-2.14.0/docs/product/sprint_board.md +24 -0
  13. pactkit-2.14.0/docs/specs/HOTFIX-slim-117.md +18 -0
  14. pactkit-2.14.0/docs/specs/HOTFIX-slim-122.md +20 -0
  15. pactkit-2.14.0/docs/specs/HOTFIX-slim-123.md +17 -0
  16. pactkit-2.14.0/docs/specs/STORY-slim-115.md +141 -0
  17. pactkit-2.14.0/docs/specs/STORY-slim-116.md +186 -0
  18. pactkit-2.14.0/docs/specs/STORY-slim-118.md +149 -0
  19. pactkit-2.14.0/docs/specs/STORY-slim-119.md +190 -0
  20. pactkit-2.14.0/docs/specs/STORY-slim-120.md +123 -0
  21. pactkit-2.14.0/docs/specs/STORY-slim-121.md +199 -0
  22. pactkit-2.14.0/docs/specs/STORY-slim-124.md +232 -0
  23. pactkit-2.14.0/docs/specs/STORY-slim-125.md +86 -0
  24. {pactkit-2.13.0 → pactkit-2.14.0}/pyproject.toml +1 -1
  25. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/__init__.py +1 -1
  26. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/cli.py +132 -0
  27. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/config.py +8 -4
  28. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/commands.py +18 -7
  29. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/skills.py +54 -1
  30. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/workflows.py +3 -0
  31. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/python_analyzer.py +98 -21
  32. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/visualize.py +42 -7
  33. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompt_cli_refs.py +1 -1
  34. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story063_prompt_slimming.py +2 -1
  35. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim026.py +2 -2
  36. pactkit-2.14.0/tests/unit/test_story_slim119.py +310 -0
  37. pactkit-2.14.0/tests/unit/test_story_slim120.py +186 -0
  38. pactkit-2.14.0/tests/unit/test_story_slim121.py +241 -0
  39. pactkit-2.14.0/tests/unit/test_story_slim125.py +105 -0
  40. pactkit-2.13.0/docs/product/archive/archive_202605.md +0 -47
  41. pactkit-2.13.0/docs/product/context.md +0 -29
  42. pactkit-2.13.0/docs/product/sprint_board.md +0 -8
  43. {pactkit-2.13.0 → pactkit-2.14.0}/.github/workflows/publish.yml +0 -0
  44. {pactkit-2.13.0 → pactkit-2.14.0}/AGENTS.md +0 -0
  45. {pactkit-2.13.0 → pactkit-2.14.0}/CODE_OF_CONDUCT.md +0 -0
  46. {pactkit-2.13.0 → pactkit-2.14.0}/CONTRIBUTING.md +0 -0
  47. {pactkit-2.13.0 → pactkit-2.14.0}/LICENSE +0 -0
  48. {pactkit-2.13.0 → pactkit-2.14.0}/SECURITY.md +0 -0
  49. {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  50. {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/archive/lessons_archive_202603.md +0 -0
  51. {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/harness_audit.json +0 -0
  52. {pactkit-2.13.0 → pactkit-2.14.0}/docs/architecture/governance/philosophy.md +0 -0
  53. {pactkit-2.13.0 → pactkit-2.14.0}/docs/assets/logo.png +0 -0
  54. {pactkit-2.13.0 → pactkit-2.14.0}/docs/e2e/journey.md +0 -0
  55. {pactkit-2.13.0 → pactkit-2.14.0}/docs/guides/codex-integration-preresearch.md +0 -0
  56. {pactkit-2.13.0 → pactkit-2.14.0}/docs/guides/tool-integration-checklist.md +0 -0
  57. {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/archive/archive_202602.md +0 -0
  58. {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/archive/archive_202603.md +0 -0
  59. {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/archive/archive_202604.md +0 -0
  60. {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/friction-log.md +0 -0
  61. {pactkit-2.13.0 → pactkit-2.14.0}/docs/product/prd.md +0 -0
  62. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-001.md +0 -0
  63. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-002.md +0 -0
  64. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-003.md +0 -0
  65. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-004.md +0 -0
  66. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-005.md +0 -0
  67. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-006.md +0 -0
  68. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-007.md +0 -0
  69. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-008.md +0 -0
  70. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-009.md +0 -0
  71. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-010.md +0 -0
  72. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-011.md +0 -0
  73. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-012.md +0 -0
  74. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-013.md +0 -0
  75. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-014.md +0 -0
  76. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-015.md +0 -0
  77. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-016.md +0 -0
  78. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-017.md +0 -0
  79. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-018.md +0 -0
  80. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-019.md +0 -0
  81. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-020.md +0 -0
  82. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-021.md +0 -0
  83. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-022.md +0 -0
  84. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-023.md +0 -0
  85. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-024.md +0 -0
  86. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-025.md +0 -0
  87. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-026.md +0 -0
  88. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-027.md +0 -0
  89. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-028.md +0 -0
  90. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-029.md +0 -0
  91. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-030.md +0 -0
  92. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-031.md +0 -0
  93. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-032.md +0 -0
  94. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-033.md +0 -0
  95. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-034.md +0 -0
  96. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-035.md +0 -0
  97. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-001.md +0 -0
  98. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-002.md +0 -0
  99. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-003.md +0 -0
  100. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-004.md +0 -0
  101. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-005.md +0 -0
  102. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-006.md +0 -0
  103. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-089.md +0 -0
  104. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/BUG-slim-107.md +0 -0
  105. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-023.md +0 -0
  106. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-049.md +0 -0
  107. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-050.md +0 -0
  108. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-051.md +0 -0
  109. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-052.md +0 -0
  110. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-061.md +0 -0
  111. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-062.md +0 -0
  112. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-067.md +0 -0
  113. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-069.md +0 -0
  114. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-070.md +0 -0
  115. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-085.md +0 -0
  116. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-087.md +0 -0
  117. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-096.md +0 -0
  118. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-099.md +0 -0
  119. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/HOTFIX-slim-107.md +0 -0
  120. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-001.md +0 -0
  121. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-002.md +0 -0
  122. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-003.md +0 -0
  123. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-004.md +0 -0
  124. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-005.md +0 -0
  125. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-006.md +0 -0
  126. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-007.md +0 -0
  127. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-008.md +0 -0
  128. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-009.md +0 -0
  129. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-010.md +0 -0
  130. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-011.md +0 -0
  131. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-012.md +0 -0
  132. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-013.md +0 -0
  133. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-014.md +0 -0
  134. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-015.md +0 -0
  135. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-016.md +0 -0
  136. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-017.md +0 -0
  137. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-018.md +0 -0
  138. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-019.md +0 -0
  139. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-020.md +0 -0
  140. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-021.md +0 -0
  141. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-022.md +0 -0
  142. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-023.md +0 -0
  143. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-024.md +0 -0
  144. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-025.md +0 -0
  145. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-026.md +0 -0
  146. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-027.md +0 -0
  147. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-028.md +0 -0
  148. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-029.md +0 -0
  149. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-030.md +0 -0
  150. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-031.md +0 -0
  151. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-032.md +0 -0
  152. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-033.md +0 -0
  153. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-034.md +0 -0
  154. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-035.md +0 -0
  155. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-036.md +0 -0
  156. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-037.md +0 -0
  157. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-038.md +0 -0
  158. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-039.md +0 -0
  159. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-040.md +0 -0
  160. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-041.md +0 -0
  161. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-042.md +0 -0
  162. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-043.md +0 -0
  163. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-044.md +0 -0
  164. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-045.md +0 -0
  165. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-046.md +0 -0
  166. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-047.md +0 -0
  167. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-048.md +0 -0
  168. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-049.md +0 -0
  169. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-050.md +0 -0
  170. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-051.md +0 -0
  171. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-052.md +0 -0
  172. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-053.md +0 -0
  173. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-054.md +0 -0
  174. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-055.md +0 -0
  175. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-056.md +0 -0
  176. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-057.md +0 -0
  177. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-058.md +0 -0
  178. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-059.md +0 -0
  179. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-060.md +0 -0
  180. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-061.md +0 -0
  181. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-062.md +0 -0
  182. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-063.md +0 -0
  183. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-064.md +0 -0
  184. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-065.md +0 -0
  185. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-069.md +0 -0
  186. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-070.md +0 -0
  187. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-071.md +0 -0
  188. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-072.md +0 -0
  189. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-073.md +0 -0
  190. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-001.md +0 -0
  191. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-005.md +0 -0
  192. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-006.md +0 -0
  193. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-007.md +0 -0
  194. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-009.md +0 -0
  195. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-010.md +0 -0
  196. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-011.md +0 -0
  197. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-012.md +0 -0
  198. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-013.md +0 -0
  199. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-014.md +0 -0
  200. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-015.md +0 -0
  201. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-016.md +0 -0
  202. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-017.md +0 -0
  203. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-018.md +0 -0
  204. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-019.md +0 -0
  205. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-020.md +0 -0
  206. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-021.md +0 -0
  207. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-022.md +0 -0
  208. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-023.md +0 -0
  209. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-024.md +0 -0
  210. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-028.md +0 -0
  211. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-029.md +0 -0
  212. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-030.md +0 -0
  213. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-031.md +0 -0
  214. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-032.md +0 -0
  215. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-033.md +0 -0
  216. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-034.md +0 -0
  217. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-035.md +0 -0
  218. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-036.md +0 -0
  219. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-037.md +0 -0
  220. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-038.md +0 -0
  221. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-039.md +0 -0
  222. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-040.md +0 -0
  223. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-041.md +0 -0
  224. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-042.md +0 -0
  225. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-043.md +0 -0
  226. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-044.md +0 -0
  227. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-045.md +0 -0
  228. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-046.md +0 -0
  229. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-047.md +0 -0
  230. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-048.md +0 -0
  231. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-049.md +0 -0
  232. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-050.md +0 -0
  233. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-051.md +0 -0
  234. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-052.md +0 -0
  235. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-053.md +0 -0
  236. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-054.md +0 -0
  237. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-055.md +0 -0
  238. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-056.md +0 -0
  239. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-057.md +0 -0
  240. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-058.md +0 -0
  241. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-059.md +0 -0
  242. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-060.md +0 -0
  243. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-063.md +0 -0
  244. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-066.md +0 -0
  245. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-067.md +0 -0
  246. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-068.md +0 -0
  247. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-069.md +0 -0
  248. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-070.md +0 -0
  249. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-071.md +0 -0
  250. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-072.md +0 -0
  251. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-073.md +0 -0
  252. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-074.md +0 -0
  253. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-075.md +0 -0
  254. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-076.md +0 -0
  255. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-077.md +0 -0
  256. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-078.md +0 -0
  257. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-079.md +0 -0
  258. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-080.md +0 -0
  259. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-081.md +0 -0
  260. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-082.md +0 -0
  261. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-083.md +0 -0
  262. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-084.md +0 -0
  263. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-086.md +0 -0
  264. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-088.md +0 -0
  265. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-089.md +0 -0
  266. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-090.md +0 -0
  267. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-091.md +0 -0
  268. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-092.md +0 -0
  269. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-093.md +0 -0
  270. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-094.md +0 -0
  271. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-095.md +0 -0
  272. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-097.md +0 -0
  273. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-098.md +0 -0
  274. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-099.md +0 -0
  275. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-100.md +0 -0
  276. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-101.md +0 -0
  277. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-102.md +0 -0
  278. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-103.md +0 -0
  279. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-104.md +0 -0
  280. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-105.md +0 -0
  281. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-106.md +0 -0
  282. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-107.md +0 -0
  283. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-108.md +0 -0
  284. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-109.md +0 -0
  285. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-110.md +0 -0
  286. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-111.md +0 -0
  287. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-112.md +0 -0
  288. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-113.md +0 -0
  289. {pactkit-2.13.0 → pactkit-2.14.0}/docs/specs/STORY-slim-114.md +0 -0
  290. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/BUG-001_case.md +0 -0
  291. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/BUG-002_case.md +0 -0
  292. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
  293. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
  294. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
  295. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
  296. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
  297. {pactkit-2.13.0 → pactkit-2.14.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
  298. {pactkit-2.13.0 → pactkit-2.14.0}/opencode.json +0 -0
  299. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/__main__.py +0 -0
  300. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/audit.py +0 -0
  301. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/backfill.py +0 -0
  302. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/cleaners.py +0 -0
  303. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/context_gen.py +0 -0
  304. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/coverage_gate.py +0 -0
  305. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/doctor.py +0 -0
  306. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/garden.py +0 -0
  307. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/__init__.py +0 -0
  308. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/adapter.py +0 -0
  309. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/deploy_base.py +0 -0
  310. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/generators/deployer.py +0 -0
  311. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/guards.py +0 -0
  312. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/id_generator.py +0 -0
  313. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/invariants.py +0 -0
  314. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/issue_sync.py +0 -0
  315. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/lazy_visualize.py +0 -0
  316. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/lessons.py +0 -0
  317. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/lint_runner.py +0 -0
  318. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/observe.py +0 -0
  319. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/profiles.py +0 -0
  320. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/__init__.py +0 -0
  321. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/agents.py +0 -0
  322. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/references.py +0 -0
  323. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/prompts/rules.py +0 -0
  324. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/regression.py +0 -0
  325. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/schemas.py +0 -0
  326. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/scripts.py +0 -0
  327. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/sec_scope.py +0 -0
  328. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/__init__.py +0 -0
  329. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
  330. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  331. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  332. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  333. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/board.py +0 -0
  334. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/interface_summary.py +0 -0
  335. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/report.py +0 -0
  336. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/scaffold.py +0 -0
  337. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/skills/spec_linter.py +0 -0
  338. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/spec_status.py +0 -0
  339. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/test_mapper.py +0 -0
  340. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/utils.py +0 -0
  341. {pactkit-2.13.0 → pactkit-2.14.0}/src/pactkit/validators.py +0 -0
  342. {pactkit-2.13.0 → pactkit-2.14.0}/tests/conftest.py +0 -0
  343. {pactkit-2.13.0 → pactkit-2.14.0}/tests/e2e/__init__.py +0 -0
  344. {pactkit-2.13.0 → pactkit-2.14.0}/tests/e2e/cli/__init__.py +0 -0
  345. {pactkit-2.13.0 → pactkit-2.14.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
  346. {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  347. {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  348. {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  349. {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  350. {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  351. {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  352. {pactkit-2.13.0 → pactkit-2.14.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
  353. {pactkit-2.13.0 → pactkit-2.14.0}/tests/integration/__init__.py +0 -0
  354. {pactkit-2.13.0 → pactkit-2.14.0}/tests/integration/test_deploy_classic.py +0 -0
  355. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_agent_features.py +0 -0
  356. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_agent_frontmatter.py +0 -0
  357. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_agents_enrichment.py +0 -0
  358. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_audit.py +0 -0
  359. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_blast_radius.py +0 -0
  360. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_board_bug027.py +0 -0
  361. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_board_sections.py +0 -0
  362. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug001_skill_path.py +0 -0
  363. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
  364. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug003_multi_import.py +0 -0
  365. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug004_dead_set.py +0 -0
  366. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
  367. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
  368. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  369. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  370. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  371. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  372. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug011_stale_refs.py +0 -0
  373. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  374. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug013_config_single_source.py +0 -0
  375. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
  376. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  377. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  378. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
  379. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  380. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug025_release_delegation.py +0 -0
  381. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug026_version_sync.py +0 -0
  382. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
  383. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  384. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  385. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  386. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  387. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_021.py +0 -0
  388. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_022.py +0 -0
  389. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_023.py +0 -0
  390. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_024.py +0 -0
  391. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  392. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  393. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim003.py +0 -0
  394. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim004.py +0 -0
  395. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim005.py +0 -0
  396. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim006.py +0 -0
  397. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  398. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_check_command.py +0 -0
  399. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_check_extensions_072_073.py +0 -0
  400. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_check_playbook_072_073.py +0 -0
  401. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_command_frontmatter.py +0 -0
  402. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_command_visualize_modes.py +0 -0
  403. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_complexity.py +0 -0
  404. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_config.py +0 -0
  405. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_config_auto_merge.py +0 -0
  406. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_constitution_sharpening.py +0 -0
  407. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_context_gen.py +0 -0
  408. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_create_skill.py +0 -0
  409. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_cross_flow_matrix.py +0 -0
  410. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_deploy_base.py +0 -0
  411. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_deployer_cleanup.py +0 -0
  412. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_deployer_plugin.py +0 -0
  413. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_design_command.py +0 -0
  414. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_done_gates.py +0 -0
  415. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_draw_prompt.py +0 -0
  416. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_draw_references.py +0 -0
  417. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_drawio_mcp.py +0 -0
  418. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_garden.py +0 -0
  419. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_home_path_fix.py +0 -0
  420. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_hotfix_command.py +0 -0
  421. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_init_guard.py +0 -0
  422. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_init_playbook_074.py +0 -0
  423. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_interface_summary.py +0 -0
  424. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_lang_profiles.py +0 -0
  425. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_layer_violations.py +0 -0
  426. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_lessons_rotation_075.py +0 -0
  427. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_list_stories.py +0 -0
  428. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_mcp_integration.py +0 -0
  429. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_model_config.py +0 -0
  430. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_modular_constitution.py +0 -0
  431. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_monorepo_detect.py +0 -0
  432. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_multi_prefix.py +0 -0
  433. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_observe.py +0 -0
  434. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_pdca_slim.py +0 -0
  435. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_profiles.py +0 -0
  436. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_project_visibility.py +0 -0
  437. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompt_quality_075.py +0 -0
  438. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
  439. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_prompts_package.py +0 -0
  440. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_release.py +0 -0
  441. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_release_field.py +0 -0
  442. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_release_v110.py +0 -0
  443. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_render_prompt.py +0 -0
  444. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_report_parser.py +0 -0
  445. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_report_unified.py +0 -0
  446. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_review_command.py +0 -0
  447. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_rules_enrichment.py +0 -0
  448. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_scaffold.py +0 -0
  449. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  450. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_schemas.py +0 -0
  451. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_script_extraction.py +0 -0
  452. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_selective_deploy.py +0 -0
  453. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_session_context.py +0 -0
  454. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_skill_structure.py +0 -0
  455. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_skills_enrichment.py +0 -0
  456. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_slim_deps_088.py +0 -0
  457. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_smart_regression.py +0 -0
  458. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_solution_design_rule.py +0 -0
  459. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_sprint_command.py +0 -0
  460. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_stack_references.py +0 -0
  461. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_status_command.py +0 -0
  462. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_statusline.py +0 -0
  463. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story014_release.py +0 -0
  464. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  465. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story016_claude_md.py +0 -0
  466. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story017_init_claude_md.py +0 -0
  467. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story018_arch_staleness.py +0 -0
  468. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story019_bailout.py +0 -0
  469. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story020_horizon.py +0 -0
  470. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story021_rfc.py +0 -0
  471. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story022_decision_tree.py +0 -0
  472. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story023_test_quality.py +0 -0
  473. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story024_native_agent.py +0 -0
  474. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
  475. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story026_issue_tracker.py +0 -0
  476. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story028_rule_scoping.py +0 -0
  477. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story029_doctor.py +0 -0
  478. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story030_lint.py +0 -0
  479. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story031_git_init_guard.py +0 -0
  480. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  481. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story033_config_backfill.py +0 -0
  482. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  483. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story035_readme_docs.py +0 -0
  484. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story037_regression_fix.py +0 -0
  485. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story038_call_graph_update.py +0 -0
  486. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story039_venv_config.py +0 -0
  487. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
  488. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story042_spec_linter.py +0 -0
  489. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story043_active_clarify.py +0 -0
  490. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story044_consistency_check.py +0 -0
  491. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story045_auto_pr.py +0 -0
  492. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story046_agent_adapter.py +0 -0
  493. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
  494. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
  495. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story049_community_standards.py +0 -0
  496. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  497. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  498. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
  499. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story053_impact_regression.py +0 -0
  500. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story055_commands.py +0 -0
  501. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story055_config.py +0 -0
  502. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story055_spec_linter.py +0 -0
  503. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story056_commands.py +0 -0
  504. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story056_config.py +0 -0
  505. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  506. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
  507. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story058_routing_fix.py +0 -0
  508. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story059_codex_removal.py +0 -0
  509. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story060_init_hang.py +0 -0
  510. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story061_remove_thinking.py +0 -0
  511. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  512. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story064_venv_local_md.py +0 -0
  513. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story065_sprint_model.py +0 -0
  514. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story072_developer_prefix.py +0 -0
  515. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story106_lateral_scan.py +0 -0
  516. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  517. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  518. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim011_command_rules.py +0 -0
  519. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim012_ci.py +0 -0
  520. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_clean.py +0 -0
  521. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_context.py +0 -0
  522. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_guard.py +0 -0
  523. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  524. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_next_id.py +0 -0
  525. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_regression.py +0 -0
  526. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  527. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim014_validators.py +0 -0
  528. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim015_doctor.py +0 -0
  529. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  530. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim017.py +0 -0
  531. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim018.py +0 -0
  532. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  533. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  534. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim021.py +0 -0
  535. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim022.py +0 -0
  536. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim023.py +0 -0
  537. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim024.py +0 -0
  538. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim025.py +0 -0
  539. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim027.py +0 -0
  540. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim028.py +0 -0
  541. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim029.py +0 -0
  542. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim030.py +0 -0
  543. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim031.py +0 -0
  544. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim032.py +0 -0
  545. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim033.py +0 -0
  546. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim034.py +0 -0
  547. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim035.py +0 -0
  548. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim036.py +0 -0
  549. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim037.py +0 -0
  550. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim038.py +0 -0
  551. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim039.py +0 -0
  552. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim040.py +0 -0
  553. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim041.py +0 -0
  554. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim042.py +0 -0
  555. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim043.py +0 -0
  556. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim044.py +0 -0
  557. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim045.py +0 -0
  558. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim046.py +0 -0
  559. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim047.py +0 -0
  560. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim048.py +0 -0
  561. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim049.py +0 -0
  562. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim051.py +0 -0
  563. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim052.py +0 -0
  564. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim053.py +0 -0
  565. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim054.py +0 -0
  566. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim055.py +0 -0
  567. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim056.py +0 -0
  568. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  569. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim063.py +0 -0
  570. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim065.py +0 -0
  571. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim076_multistack.py +0 -0
  572. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  573. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim078.py +0 -0
  574. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim079.py +0 -0
  575. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim080.py +0 -0
  576. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim081.py +0 -0
  577. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim082.py +0 -0
  578. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim083.py +0 -0
  579. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim084.py +0 -0
  580. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim095.py +0 -0
  581. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  582. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  583. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
  584. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
  585. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim107.py +0 -0
  586. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
  587. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
  588. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
  589. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_story_slim114_journey_sync.py +0 -0
  590. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_tools.py +0 -0
  591. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_topology_parsers_066.py +0 -0
  592. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_update_task.py +0 -0
  593. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_call_nested.py +0 -0
  594. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_chain_fix.py +0 -0
  595. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_modes.py +0 -0
  596. {pactkit-2.13.0 → pactkit-2.14.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -0,0 +1,16 @@
1
+ # CodeGraph data files
2
+ # These are local to each machine and should not be committed
3
+
4
+ # Database
5
+ *.db
6
+ *.db-wal
7
+ *.db-shm
8
+
9
+ # Cache
10
+ cache/
11
+
12
+ # Logs
13
+ *.log
14
+
15
+ # Hook markers
16
+ .dirty
@@ -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 ".[visualize]"
23
+ pip install -e .
24
24
  pip install pytest ruff
25
25
  pactkit init
26
26
 
@@ -62,3 +62,6 @@ coder/
62
62
  docker/
63
63
  docs/slides/
64
64
 
65
+
66
+ # Call graph SQLite output (STORY-slim-121)
67
+ docs/architecture/graphs/*.db
@@ -143,6 +143,7 @@ agent_models:
143
143
 
144
144
  # Visualize — configure directory scan exclusions
145
145
  visualize:
146
+ graph_provider: codegraph
146
147
  scan_excludes:
147
148
  - venv
148
149
  - _venv
@@ -4,9 +4,29 @@ All notable changes to PactKit will be documented in this file.
4
4
 
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/).
6
6
 
7
- ## [2.13.0] - 2026-05-07
7
+ ## [2.14.0] - 2026-05-26
8
8
 
9
9
  ### Added
10
+ - **Codegraph integration** (STORY-slim-124) — `pactkit query` now reads from `.codegraph/codegraph.db` (generated by `@colbymchenry/codegraph`) when `visualize.graph_provider: codegraph` is configured. Provides 2.6x more edges than pactkit's own suffix-match resolution (6580 vs 2483 in real projects), with qualified names, line numbers, and type-aware resolution.
11
+ - **Auto-init codegraph** — When `graph_provider: codegraph` is set and `.codegraph/codegraph.db` is missing, `pactkit query` auto-runs `codegraph init -i` if the CLI is on PATH. Plan/Act phases also auto-setup codegraph when detected.
12
+ - **Graph Query Protocol dual-mode** — PDCA commands now support two modes: Codegraph Mode (`pactkit query` + codegraph CLI + MCP tools) and Grep Mode (default fallback on `.mmd` files).
13
+
14
+ ### Removed
15
+ - **`_write_sqlite_db()`** — Pactkit no longer generates its own `call_graph.db`. The upstream codegraph tool produces a superior graph with tree-sitter + import-aware resolution.
16
+ - **`visualize.sqlite_output` config** — Replaced by `visualize.graph_provider: codegraph`. Existing configs should migrate.
17
+
18
+ ### Changed
19
+ - **`pactkit query`** — Now reads `.codegraph/codegraph.db` (codegraph schema with hash IDs, JOIN edges+nodes) instead of pactkit's own `call_graph.db`.
20
+ - **PDCA prompts updated** — All references to `call_graph.db` / "SQLite Mode" removed from Plan, Act, Check, Done, Hotfix, and Trace skills. Impact analysis uses `pactkit query --callers` (codegraph) or grep `.mmd` (default).
21
+
22
+ ## [2.13.0] - 2026-05-25
23
+
24
+ ### Added
25
+ - **Call graph SQLite output** (STORY-slim-121) — `pactkit visualize --mode call` now optionally writes `call_graph.db` alongside the existing `.mmd` file. Enable via `visualize.sqlite_output: true` in `pactkit.yaml`. Atomic write (tmp+rename), zero new dependencies (`sqlite3` stdlib).
26
+ - **`pactkit query` CLI** (STORY-slim-121) — New subcommand for structured call graph queries: `--callers <func>` (fan-in), `--callees <func>` (fan-out), `--chain <func> [--down]` (transitive upstream/downstream via recursive CTE). Reads from `call_graph.db`; exits with helpful message when db is missing.
27
+ - **Graph Query Protocol upgrade** (STORY-slim-121) — `SKILL_VISUALIZE_MD` now routes to `pactkit query` as primary path when `call_graph.db` exists, with grep as fallback for mmd-only projects.
28
+ - **Enhanced Python call graph coverage** (STORY-slim-119) — `_extract_calls` now captures non-self attribute calls (`engine.run()`), function references in list/tuple/keyword/assign contexts, and nested functions via `ast.walk` + parent map. Edge count on medium-large projects: 1,360 → 3,764 (+177%).
29
+ - **Test and script scanning in call graph** (STORY-slim-120) — `visualize --mode call` now scans `tests/`, `scripts/`, and `alembic/` directories in addition to `src/`. Locality-based `_resolve_callee` prefers same-file/same-package candidates when multiple matches exist.
10
30
  - **`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
31
  - **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
32
  - **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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.13.0
3
+ Version: 2.14.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
@@ -55,7 +55,7 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  > **PactKit** (Pact 契约 + Kit) is a governance framework that enforces the **P.A.C.T.** contract between humans and AI agents. Deterministic operations run as code, not prompts. Decisions are grounded in data, not memory. AI does what it's best at — creativity and language — while code handles everything that must be repeatable and correct.
57
57
  >
58
- > 25 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
58
+ > 26 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
59
59
 
60
60
  ### Supported AI Tools
61
61
 
@@ -247,7 +247,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
247
247
 
248
248
  | Skill | Type | Purpose |
249
249
  |-------|------|---------|
250
- | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid): file-level, class-level, call-level |
250
+ | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid .mmd): file-level, class-level, call-level |
251
251
  | **pactkit-board** | Scripted | Sprint board operations: add story, update task, archive |
252
252
  | **pactkit-scaffold** | Scripted | File scaffolding: create spec, test files, git branches, skills |
253
253
  | **pactkit-trace** | Prompt-only | Deep code tracing and execution flow analysis |
@@ -260,7 +260,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
260
260
 
261
261
  ## CLI Subcommands
262
262
 
263
- PactKit ships 25 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
263
+ PactKit ships 26 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
264
264
 
265
265
  | Command | Purpose |
266
266
  |---------|---------|
@@ -281,6 +281,7 @@ PactKit ships 25 deterministic CLI subcommands — operations that were previous
281
281
  | `pactkit test-map` | Map source files to test files |
282
282
  | `pactkit coverage-gate` | Enforce 3-tier coverage thresholds (80/50/block) |
283
283
  | `pactkit visualize` | Conditional graph regeneration (lazy mode) |
284
+ | `pactkit query` | Query call graph via codegraph: `--callers`, `--callees`, `--chain [--down]` (requires `graph_provider: codegraph`) |
284
285
  | `pactkit lesson-append` | Append lesson with specificity check and dedup |
285
286
  | `pactkit invariants-refresh` | Update test count invariant in rules.md |
286
287
  | `pactkit sec-scope` | Detect security scope for changed files |
@@ -375,6 +376,7 @@ docs/
375
376
  | `skills` | list | all 10 | Skills to deploy |
376
377
  | `rules` | list | all 8 | Constitution rule modules to deploy |
377
378
  | `exclude` | object | `{}` | Components to exclude (e.g., `exclude.agents: [agent-name]`) |
379
+ | `visualize.graph_provider` | string | (absent) | Graph query backend. Set `codegraph` to use `.codegraph/codegraph.db` for `pactkit query`. Absent = grep `.mmd` |
378
380
  | `ci` | object | `provider: none` | CI/CD pipeline generation (`github`, `gitlab`, `none`). Sub-fields: `runner` (default: `ubuntu-latest`), `language_version` (default: auto per stack), `github_host` (GHE server address), `actions_ref` (GHE actions prefix) |
379
381
  | `issue_tracker` | object | `provider: none` | External issue tracker (`github`, `none`) |
380
382
  | `hooks` | object | disabled | Opt-in hook templates (pre-commit, post-test, pre-push) |
@@ -13,7 +13,7 @@
13
13
 
14
14
  > **PactKit** (Pact 契约 + Kit) is a governance framework that enforces the **P.A.C.T.** contract between humans and AI agents. Deterministic operations run as code, not prompts. Decisions are grounded in data, not memory. AI does what it's best at — creativity and language — while code handles everything that must be repeatable and correct.
15
15
  >
16
- > 25 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
16
+ > 26 CLI subcommands, 9 specialized agents, 11 commands, 10 skills, and a full Plan-Act-Check-Done lifecycle. One `pip install` deploys to all 3 supported IDEs.
17
17
 
18
18
  ### Supported AI Tools
19
19
 
@@ -205,7 +205,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
205
205
 
206
206
  | Skill | Type | Purpose |
207
207
  |-------|------|---------|
208
- | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid): file-level, class-level, call-level |
208
+ | **pactkit-visualize** | Scripted | Code dependency graph (Mermaid .mmd): file-level, class-level, call-level |
209
209
  | **pactkit-board** | Scripted | Sprint board operations: add story, update task, archive |
210
210
  | **pactkit-scaffold** | Scripted | File scaffolding: create spec, test files, git branches, skills |
211
211
  | **pactkit-trace** | Prompt-only | Deep code tracing and execution flow analysis |
@@ -218,7 +218,7 @@ PactKit deploys 10 skills (3 scripted + 7 prompt-only), auto-invoked by commands
218
218
 
219
219
  ## CLI Subcommands
220
220
 
221
- PactKit ships 25 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
221
+ PactKit ships 26 deterministic CLI subcommands — operations that were previously delegated to AI prompts are now enforced in Python code (the "C" in P.A.C.T.):
222
222
 
223
223
  | Command | Purpose |
224
224
  |---------|---------|
@@ -239,6 +239,7 @@ PactKit ships 25 deterministic CLI subcommands — operations that were previous
239
239
  | `pactkit test-map` | Map source files to test files |
240
240
  | `pactkit coverage-gate` | Enforce 3-tier coverage thresholds (80/50/block) |
241
241
  | `pactkit visualize` | Conditional graph regeneration (lazy mode) |
242
+ | `pactkit query` | Query call graph via codegraph: `--callers`, `--callees`, `--chain [--down]` (requires `graph_provider: codegraph`) |
242
243
  | `pactkit lesson-append` | Append lesson with specificity check and dedup |
243
244
  | `pactkit invariants-refresh` | Update test count invariant in rules.md |
244
245
  | `pactkit sec-scope` | Detect security scope for changed files |
@@ -333,6 +334,7 @@ docs/
333
334
  | `skills` | list | all 10 | Skills to deploy |
334
335
  | `rules` | list | all 8 | Constitution rule modules to deploy |
335
336
  | `exclude` | object | `{}` | Components to exclude (e.g., `exclude.agents: [agent-name]`) |
337
+ | `visualize.graph_provider` | string | (absent) | Graph query backend. Set `codegraph` to use `.codegraph/codegraph.db` for `pactkit query`. Absent = grep `.mmd` |
336
338
  | `ci` | object | `provider: none` | CI/CD pipeline generation (`github`, `gitlab`, `none`). Sub-fields: `runner` (default: `ubuntu-latest`), `language_version` (default: auto per stack), `github_host` (GHE server address), `actions_ref` (GHE actions prefix) |
337
339
  | `issue_tracker` | object | `provider: none` | External issue tracker (`github`, `none`) |
338
340
  | `hooks` | object | disabled | Opt-in hook templates (pre-commit, post-test, pre-push) |
@@ -48,3 +48,7 @@
48
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
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
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 |
51
+ | 2026-05-25 | code_graph.mmd uses sanitized node IDs (src_pactkit_generators_deployer_py), not bare filenames — grep patterns for fan-in/fan-out must use .* wildcard or they silently never match | src/pactkit/prompts/skills.py:SKILL_VISUALIZE_MD |
52
+ | 2026-05-25 | 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 | visualize.py:_build_call_graph |
53
+ | 2026-05-25 | _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 | visualize.py:_build_call_graph |
54
+ | 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 |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3937+ tests must pass before any commit to `main`.
18
+ 1. All 3986+ 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,109 @@
1
+
2
+ ### [STORY-slim-113] pactkit interface-summary CLI — Code Enforce 接口摘要
3
+ > Spec: docs/specs/STORY-slim-113.md
4
+
5
+ - [x] 新建 interface_summary.py 提取逻辑
6
+ - [x] CLI 注册 interface-summary 命令
7
+ - [x] Act Phase 1 改为显式步骤
8
+ - [x] pactkit-trace 更新输出指引
9
+ - [x] 单元测试
10
+
11
+ ### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
12
+ > Spec: docs/specs/STORY-slim-112.md
13
+
14
+ - [x] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
15
+ - [x] 更新 deployer 双目录部署
16
+ - [x] 更新所有 skill @import 路径
17
+ - [x] 更新测试断言
18
+
19
+ ### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
20
+ > Spec: docs/specs/STORY-slim-111.md
21
+
22
+ - [x] 修改 project-check SKILL.md Phase 4 增加断言策略
23
+
24
+ ### [STORY-slim-110] project-design 集成 User Journey 生成
25
+ > Spec: docs/specs/STORY-slim-110.md
26
+
27
+ - [x] 修改 project-design SKILL.md Phase 1 Group B
28
+
29
+ ### [STORY-slim-109] E2E journey.md 规范定义与 File Atlas 集成
30
+ > Spec: docs/specs/STORY-slim-109.md
31
+
32
+ - [x] 注册 File Atlas
33
+ - [x] 创建 journey.md 格式规范
34
+ - [x] 修改 project-check Phase 4
35
+
36
+ ### [STORY-slim-108] pactkit-trace --summary 模式:接口摘要输出
37
+ > Spec: docs/specs/STORY-slim-108.md
38
+
39
+ - [x] 修改 pactkit-trace SKILL.md Phase 3
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] 单元测试
48
+
49
+ ### [HOTFIX-slim-117] Fix Graph Query Protocol grep patterns
50
+ > Spec: docs/specs/HOTFIX-slim-117.md
51
+
52
+ - [x] Fix fan-in/fan-out grep patterns in SKILL_VISUALIZE_MD
53
+ - [x] Fix importer-count grep in project-act.md Phase 3
54
+
55
+ ### [STORY-slim-116] Skill Model Precision and Graph Query Optimization
56
+ > Spec: docs/specs/STORY-slim-116.md
57
+
58
+ - [x] Add graph query protocol to project-act and project-plan
59
+ - [x] Add model field to pactkit-visualize SKILL.md
60
+ - [x] Add model fields to 28 skills missing model assignment
61
+ - [x] Update project-plan and project-sprint to opus
62
+ - [x] Add haiku to pure I/O skills (scaffold, board, doctor, status, report, draw, arch-diagram, profile, find-skills, docx, pdf, pptx, xlsx)
63
+
64
+ ### [STORY-slim-120] Improve Call Graph Coverage: Test Files, Scripts, Locality Resolution
65
+ > Spec: docs/specs/STORY-slim-120.md
66
+
67
+ - [x] Write TDD tests for AC1-AC4
68
+ - [x] R1: scan tests/ in call mode
69
+ - [x] R2: scan scripts/ and alembic/
70
+ - [x] R3: locality-based _resolve_callee
71
+ - [x] Run pactkit update
72
+
73
+ ### [STORY-slim-121] call graph SQLite output with pactkit query CLI
74
+ > Spec: docs/specs/STORY-slim-121.md
75
+
76
+ - [x] Add visualize.sqlite_output config toggle
77
+ - [x] Add _load_sqlite_config() helper
78
+ - [x] Add _write_sqlite_db() with atomic write
79
+ - [x] Wire into _build_call_graph()
80
+ - [x] Add pactkit query subcommand (fan-in/fan-out/chain)
81
+ - [x] Update SKILL_VISUALIZE_MD with pactkit query examples
82
+ - [x] Add *.db to .gitignore
83
+
84
+ ### [STORY-slim-124] codegraph integration — read .codegraph/codegraph.db as graph provider
85
+ > Spec: docs/specs/STORY-slim-124.md
86
+
87
+ - [x] Add graph_provider config to pactkit.yaml
88
+ - [x] Guard _write_sqlite_db when codegraph
89
+ - [x] Implement codegraph SQL in pactkit query
90
+ - [x] Update Graph Query Protocol in skills.py
91
+ - [x] Update PDCA prompts to prefer pactkit query
92
+
93
+ ### [HOTFIX-slim-123] Fix: call_graph.db duplicate edges and orphan nodes
94
+ > Spec: docs/specs/HOTFIX-slim-123.md
95
+
96
+ - [x] Dedup rel_edges before insert
97
+ - [x] Filter edges to only reference existing nodes
98
+
99
+ ### [HOTFIX-slim-122] Fix: focus/entry overwrites call_graph.db
100
+ > Spec: docs/specs/HOTFIX-slim-122.md
101
+
102
+ - [x] Guard sqlite write against focus/entry mode
103
+
104
+ ### [STORY-slim-125] Add model frontmatter to all PDCA command/skill prompts
105
+ > Spec: docs/specs/STORY-slim-125.md
106
+
107
+ - [x] Add model to commands.py
108
+ - [x] Add model to workflows.py
109
+ - [x] Add regression test
@@ -0,0 +1,29 @@
1
+ # Project Context (Auto-generated)
2
+ > Last updated: 2026-05-26T17:29:18+08:00 by pactkit context
3
+
4
+ ## Sprint Status
5
+ Backlog: 2 | In Progress: 0 | Done: 0 stories
6
+
7
+ ## Current Stories
8
+ None
9
+
10
+ ## Recent Completions
11
+ None
12
+
13
+ ## Active Branches
14
+ + claude/naughty-euclid-e6a787
15
+ develop
16
+ * main
17
+
18
+ ## Key Decisions
19
+ - 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']
20
+ - code_graph.mmd uses sanitized node IDs (src_pactkit_generators_deployer_py), not bare filenames — grep patterns for fan-in/fan-out must use .* wildcard or they silently never match
21
+ - 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
22
+ - _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
23
+ - 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
24
+
25
+ ## Next Recommended Action
26
+ `/project-plan`
27
+
28
+ ## Agent Continuation
29
+ No active work session.
@@ -0,0 +1,24 @@
1
+ # Sprint Board
2
+
3
+ ## 📋 Backlog
4
+
5
+ ### [STORY-slim-118] codegraph MCP Integration for Semantic Code Queries
6
+ > Spec: docs/specs/STORY-slim-118.md
7
+
8
+ - [ ] Document replacement vs augmentation decision
9
+ - [ ] Add codegraph MCP conditional note to SKILL_VISUALIZE_MD Graph Query Protocol
10
+ - [ ] Run pactkit update to redeploy
11
+
12
+ ### [STORY-slim-119] Improve Python Call Graph Coverage
13
+ > Spec: docs/specs/STORY-slim-119.md
14
+
15
+ - [ ] Extend _extract_calls to capture non-self attribute method calls (R1)
16
+ - [ ] Capture function references in list/assignment contexts (R2)
17
+ - [ ] Use ast.walk to scan nested functions (R3)
18
+ - [ ] Write TDD tests for AC1-AC4
19
+ - [ ] Run pactkit update to redeploy
20
+
21
+ ## 🔄 In Progress
22
+
23
+ ## ✅ Done
24
+
@@ -0,0 +1,18 @@
1
+ # HOTFIX-slim-117: Fix Graph Query Protocol grep patterns for code_graph.mmd
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-117 |
6
+ | Status | Done |
7
+ | Release | 2.14.0 |
8
+
9
+ ## Background
10
+
11
+ Graph Query Protocol (added in STORY-slim-116) uses `grep " --> deployer"` and `grep "deployer --> "` to filter edges in `code_graph.mmd`. However, nodes in `code_graph.mmd` are sanitized IDs (`src_pactkit_generators_deployer_py`), not bare filenames. These patterns never match — silent no-op. Correct patterns require `.*` wildcard: `grep " --> .*deployer"` (fan-in) and `grep "deployer.* --> "` (fan-out).
12
+
13
+ Same issue in `project-act.md` Phase 3 importer-count: `grep " --> <file>"` → `grep " --> .*<file>"`.
14
+
15
+ ## Target Files
16
+
17
+ - `src/pactkit/prompts/skills.py` — SKILL_VISUALIZE_MD lines 93, 96, 99
18
+ - `src/pactkit/prompts/commands.py` — project-act.md Phase 3 line 237
@@ -0,0 +1,20 @@
1
+ # HOTFIX-slim-122: prevent focus/entry mode from overwriting full call_graph.db
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-122 |
6
+ | Status | In Progress |
7
+ | Priority | P2 |
8
+ | Release | 2.13.0 |
9
+
10
+ ## Background
11
+
12
+ `_build_call_graph()` writes `call_graph.db` unconditionally when `sqlite_output: true`, including when running in `--focus` or `--entry` mode. These modes produce a subgraph (not the full call graph), so writing them to `call_graph.db` overwrites the complete dataset with a partial one.
13
+
14
+ ## Fix
15
+
16
+ Only write `call_graph.db` when both `focus` and `entry` are falsy (i.e., full graph mode).
17
+
18
+ - **Target**: `src/pactkit/skills/visualize.py`
19
+ - **Line 855**: Add `and not focus` guard (BFS/entry path)
20
+ - **Line 891**: Add `and not focus` guard (full graph path with focus filter)
@@ -0,0 +1,17 @@
1
+ # HOTFIX-slim-123: call_graph.db dedup edges and filter orphan nodes
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | HOTFIX-slim-123 |
6
+ | Status | Done |
7
+ | Priority | P1 |
8
+
9
+ ## Background
10
+
11
+ `_write_sqlite_db()` had two data quality issues: (1) duplicate edges (35.8% in pactsearch) because `rel_edges` was inserted without dedup, and (2) orphan edges referencing nodes not in `func_registry` (e.g., `__module__` synthetic callers).
12
+
13
+ ## Fix
14
+
15
+ - Target: `src/pactkit/skills/visualize.py:_write_sqlite_db()`
16
+ - Dedup `rel_edges` via set conversion before INSERT
17
+ - Filter edges to only include caller/callee pairs where both exist in `func_registry`
@@ -0,0 +1,141 @@
1
+ # STORY-slim-115: Worktree/Parallel Session Artifact Drift Prevention
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-115 |
6
+ | Title | Worktree/Parallel Session Artifact Drift Prevention |
7
+ | Status | Draft |
8
+ | Release | TBD |
9
+
10
+ ## Background
11
+
12
+ ### The Problem
13
+
14
+ PactKit 的多个共享 artifact 文件在 worktree 或并行 session 场景下会发生 **drift(漂移)**——一个 session 的正确状态被另一个 session 的旧版本覆盖。
15
+
16
+ **真实案例(koi 项目,2026-05-07)**:
17
+ 1. Session A 在 `59a043b` 完成 STORY-026/028,board 正确显示它们在 Done 区
18
+ 2. Session B(`/dev` worktree)基于更早的 board 版本工作
19
+ 3. Session B 完成 STORY-029,commit 时用自己的旧 board 覆盖了 Session A 的正确状态
20
+ 4. 结果:已完成的 STORY-026/028 被"移回" Backlog,archive 中已有记录但 board 与之矛盾
21
+
22
+ ### Hot Files 分析
23
+
24
+ 以下文件被多个 PDCA 命令读写,是并行冲突的高危区:
25
+
26
+ | File | Written By | Conflict Risk |
27
+ |------|------------|---------------|
28
+ | `docs/product/sprint_board.md` | Plan (add), Act (move to In Progress), Done (move to Done, archive) | **HIGH** — 整个文件被覆盖 |
29
+ | `docs/product/context.md` | Plan, Act, Done, Hotfix (context update) | **MEDIUM** — 最后写入者覆盖 |
30
+ | `docs/architecture/governance/lessons.md` | Done (append lessons) | **LOW** — append-only 但仍可能丢行 |
31
+ | `docs/architecture/governance/rules.md` | Done (update test count invariant) | **LOW** — 单行更新 |
32
+ | `docs/product/archive/archive_YYYYMM.md` | Done (append archived stories) | **LOW** — append-only |
33
+
34
+ ### Root Cause
35
+
36
+ 1. **Worktree 隔离不完整**:worktree 创建时 fork 了主分支的状态,但返回时没有 merge 主分支的 board 变更
37
+ 2. **Board 是 mutable 的单一文件**:状态转移(Backlog→In Progress→Done)是覆盖式操作,不是增量操作
38
+ 3. **没有 conflict detection**:commit 时如果 board 被其他 session 修改过,git 不会自动冲突(不同位置的修改会 auto-merge,导致逻辑不一致)
39
+
40
+ ## Target Call Chain
41
+
42
+ ```
43
+ /project-act → Phase 0.6 → move story to In Progress → sprint_board.md
44
+ /project-done → Phase 3.5 → archive story → sprint_board.md + archive_YYYYMM.md
45
+ /dev worktree → ... → commit → merge back → potential board drift
46
+ ```
47
+
48
+ ## Requirements
49
+
50
+ ### R1: Derived Board View (MUST)
51
+ Board 不再是手动维护的 mutable 文件,而是从 specs + archive 推导的 **view**:
52
+ - Story 存在于 `docs/specs/{ID}.md` 且 `status: backlog` → Backlog
53
+ - Story 存在于 `docs/specs/{ID}.md` 且 `status: in_progress` → In Progress
54
+ - Story 存在于 archive 或 spec `status: done` → Done(显示在 archive,不在 board)
55
+
56
+ 状态存储在 spec 文件的 frontmatter 或 metadata table 中,单 story 单文件,并行修改不同 story 不冲突。
57
+
58
+ ### R2: Board Generation Command (MUST)
59
+ `pactkit board` 命令动态生成 board 视图:
60
+ ```bash
61
+ pactkit board # 输出 markdown 格式的当前 board
62
+ pactkit board --write # 可选:写入 sprint_board.md(用于兼容现有工具)
63
+ ```
64
+
65
+ ### R3: Playbook Migration (MUST)
66
+ 修改 PDCA 命令的 board 操作:
67
+ - `/project-plan`:`pactkit spec-status {ID} backlog` 设置 spec 状态
68
+ - `/project-act`:`pactkit spec-status {ID} in_progress` 设置 spec 状态
69
+ - `/project-done`:`pactkit spec-status {ID} done` 设置 spec 状态 + archive 追加
70
+
71
+ 不再直接编辑 `sprint_board.md`。
72
+
73
+ ### R4: Worktree Merge Protocol (SHOULD)
74
+ Worktree 返回主分支前,自动检查 board 相关文件是否有冲突:
75
+ - 如果 spec 文件被主分支修改过,提示用户 merge
76
+ - 如果 archive 文件被主分支追加过,auto-merge(append-only 安全)
77
+
78
+ ### R5: Conflict Detection Hook (SHOULD)
79
+ Pre-commit hook 检测 board drift:
80
+ - 如果 `sprint_board.md` 的 base 版本与当前 HEAD 不同,警告用户
81
+ - 建议运行 `pactkit board --write` 重新生成
82
+
83
+ ### R6: Backward Compatibility (MUST)
84
+ - 现有 `sprint_board.md` 格式保持不变(generated file 或 view)
85
+ - 不使用 `pactkit` CLI 的用户仍可手动编辑 board(但建议迁移)
86
+ - Migration path:运行 `pactkit board-migrate` 从现有 board 反推 spec status
87
+
88
+ ## Security Scope
89
+
90
+ | Check | Applicable | Reason |
91
+ |-------|------------|--------|
92
+ | SEC-1 User Input | N/A | Internal tooling, no user input |
93
+ | SEC-2 Secrets | N/A | No secrets involved |
94
+ | SEC-3 File Access | N/A | Only project-local files |
95
+ | SEC-4 Network | N/A | No network access |
96
+ | SEC-5 Auth | N/A | No auth changes |
97
+ | SEC-6 Data Validation | N/A | No external data |
98
+ | SEC-7 Crypto | N/A | No crypto |
99
+ | SEC-8 Logging | N/A | No sensitive data logging |
100
+
101
+ ## Acceptance Criteria
102
+
103
+ ### AC1: Derived Board Correctness (R1, R2)
104
+ - **Given** a project with 3 specs: A (status: backlog), B (status: in_progress), C (status: done)
105
+ - **When** `pactkit board` is run
106
+ - **Then** output shows A in Backlog, B in In Progress, Done section is empty (done stories go to archive)
107
+
108
+ ### AC2: Spec Status Transition (R3)
109
+ - **Given** a spec STORY-001 with `status: backlog`
110
+ - **When** `pactkit spec-status STORY-001 in_progress` is run
111
+ - **Then** the spec file's status field is updated to `in_progress`
112
+ - **And** `pactkit board` shows STORY-001 in In Progress section
113
+
114
+ ### AC3: Parallel Session Safety (R1)
115
+ - **Given** two parallel sessions working on different stories (STORY-A and STORY-B)
116
+ - **When** both sessions complete and commit
117
+ - **Then** both stories' spec status are correctly updated (no overwrite)
118
+ - **And** `pactkit board` shows correct state for both
119
+
120
+ ### AC4: Migration from Existing Board (R6)
121
+ - **Given** an existing `sprint_board.md` with stories in various sections
122
+ - **When** `pactkit board-migrate` is run
123
+ - **Then** each story's spec file is updated with the correct status
124
+ - **And** `pactkit board` reproduces the original board structure
125
+
126
+ ## Implementation Steps
127
+
128
+ | Step | File | Change |
129
+ |------|------|--------|
130
+ | 1 | `src/pactkit/board.py` | New module: `generate_board()`, `get_spec_status()`, `set_spec_status()` |
131
+ | 2 | `src/pactkit/cli.py` | Add `board`, `spec-status`, `board-migrate` commands |
132
+ | 3 | `pactkit-plugin/commands/project-plan.md` | Replace board edit with `pactkit spec-status` |
133
+ | 4 | `pactkit-plugin/commands/project-act.md` | Replace board edit with `pactkit spec-status` |
134
+ | 5 | `pactkit-plugin/commands/project-done.md` | Replace board edit with `pactkit spec-status` |
135
+ | 6 | `tests/unit/test_board.py` | Unit tests for board generation and status transitions |
136
+
137
+ ## Notes
138
+
139
+ - 这个改动是 **breaking change**,需要在 release notes 中说明 migration path
140
+ - 考虑添加 `pactkit.yaml` 配置项 `board.mode: derived | legacy` 支持渐进迁移
141
+ - Context.md 的 drift 问题较轻(信息类文件,不影响工作流状态),可以后续处理