pactkit 2.19.0__tar.gz → 2.20.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 (671) hide show
  1. {pactkit-2.19.0 → pactkit-2.20.0}/.gitignore +1 -0
  2. {pactkit-2.19.0 → pactkit-2.20.0}/CHANGELOG.md +8 -0
  3. {pactkit-2.19.0 → pactkit-2.20.0}/PKG-INFO +4 -3
  4. {pactkit-2.19.0 → pactkit-2.20.0}/README.md +3 -2
  5. {pactkit-2.19.0 → pactkit-2.20.0}/docs/architecture/governance/archive/lessons_archive_202604.md +1 -0
  6. {pactkit-2.19.0 → pactkit-2.20.0}/docs/architecture/governance/lessons.md +1 -1
  7. {pactkit-2.19.0 → pactkit-2.20.0}/docs/architecture/governance/rules.md +1 -1
  8. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/archive/archive_202608.md +9 -0
  9. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/context.md +5 -5
  10. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/sprint_board.md +9 -1
  11. pactkit-2.20.0/docs/specs/STORY-slim-145.md +289 -0
  12. pactkit-2.20.0/docs/specs/STORY-slim-146.md +228 -0
  13. pactkit-2.20.0/docs/test_cases/STORY-slim-146_case.md +69 -0
  14. {pactkit-2.19.0 → pactkit-2.20.0}/pyproject.toml +1 -1
  15. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/__init__.py +1 -1
  16. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/cli.py +114 -0
  17. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/context_gen.py +53 -2
  18. pactkit-2.20.0/src/pactkit/continuation.py +539 -0
  19. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/doctor.py +66 -7
  20. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/garden.py +14 -0
  21. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/generators/deploy_base.py +48 -0
  22. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/generators/deployer.py +113 -10
  23. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/profiles.py +38 -8
  24. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/commands.py +5 -0
  25. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/skills.py +46 -0
  26. pactkit-2.20.0/tests/e2e/cli/test_story_slim146_cli.py +126 -0
  27. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_context_gen.py +62 -0
  28. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story059_codex_removal.py +4 -2
  29. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story063_prompt_slimming.py +4 -1
  30. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim084.py +6 -3
  31. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim142_all_target_isolation.py +4 -0
  32. pactkit-2.20.0/tests/unit/test_story_slim145.py +340 -0
  33. pactkit-2.20.0/tests/unit/test_story_slim146.py +744 -0
  34. {pactkit-2.19.0 → pactkit-2.20.0}/.codegraph/.gitignore +0 -0
  35. {pactkit-2.19.0 → pactkit-2.20.0}/.coverage +0 -0
  36. {pactkit-2.19.0 → pactkit-2.20.0}/.github/workflows/pactkit.yml +0 -0
  37. {pactkit-2.19.0 → pactkit-2.20.0}/.github/workflows/publish.yml +0 -0
  38. {pactkit-2.19.0 → pactkit-2.20.0}/AGENTS.md +0 -0
  39. {pactkit-2.19.0 → pactkit-2.20.0}/CODE_OF_CONDUCT.md +0 -0
  40. {pactkit-2.19.0 → pactkit-2.20.0}/CONTRIBUTING.md +0 -0
  41. {pactkit-2.19.0 → pactkit-2.20.0}/LICENSE +0 -0
  42. {pactkit-2.19.0 → pactkit-2.20.0}/SECURITY.md +0 -0
  43. {pactkit-2.19.0 → pactkit-2.20.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  44. {pactkit-2.19.0 → pactkit-2.20.0}/docs/architecture/governance/archive/lessons_archive_202603.md +0 -0
  45. {pactkit-2.19.0 → pactkit-2.20.0}/docs/architecture/governance/harness_audit.json +0 -0
  46. {pactkit-2.19.0 → pactkit-2.20.0}/docs/architecture/governance/philosophy.md +0 -0
  47. {pactkit-2.19.0 → pactkit-2.20.0}/docs/assets/logo.png +0 -0
  48. {pactkit-2.19.0 → pactkit-2.20.0}/docs/e2e/journey.md +0 -0
  49. {pactkit-2.19.0 → pactkit-2.20.0}/docs/guides/codex-integration-preresearch.md +0 -0
  50. {pactkit-2.19.0 → pactkit-2.20.0}/docs/guides/tool-integration-checklist.md +0 -0
  51. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/archive/archive_202602.md +0 -0
  52. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/archive/archive_202603.md +0 -0
  53. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/archive/archive_202604.md +0 -0
  54. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/archive/archive_202605.md +0 -0
  55. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/archive/archive_202606.md +0 -0
  56. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/archive/archive_202607.md +0 -0
  57. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/friction-log.md +0 -0
  58. {pactkit-2.19.0 → pactkit-2.20.0}/docs/product/prd.md +0 -0
  59. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-001.md +0 -0
  60. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-002.md +0 -0
  61. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-003.md +0 -0
  62. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-004.md +0 -0
  63. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-005.md +0 -0
  64. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-006.md +0 -0
  65. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-007.md +0 -0
  66. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-008.md +0 -0
  67. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-009.md +0 -0
  68. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-010.md +0 -0
  69. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-011.md +0 -0
  70. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-012.md +0 -0
  71. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-013.md +0 -0
  72. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-014.md +0 -0
  73. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-015.md +0 -0
  74. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-016.md +0 -0
  75. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-017.md +0 -0
  76. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-018.md +0 -0
  77. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-019.md +0 -0
  78. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-020.md +0 -0
  79. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-021.md +0 -0
  80. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-022.md +0 -0
  81. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-023.md +0 -0
  82. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-024.md +0 -0
  83. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-025.md +0 -0
  84. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-026.md +0 -0
  85. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-027.md +0 -0
  86. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-028.md +0 -0
  87. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-029.md +0 -0
  88. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-030.md +0 -0
  89. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-031.md +0 -0
  90. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-032.md +0 -0
  91. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-033.md +0 -0
  92. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-034.md +0 -0
  93. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-035.md +0 -0
  94. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-001.md +0 -0
  95. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-002.md +0 -0
  96. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-003.md +0 -0
  97. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-004.md +0 -0
  98. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-005.md +0 -0
  99. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-006.md +0 -0
  100. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-089.md +0 -0
  101. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/BUG-slim-107.md +0 -0
  102. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-023.md +0 -0
  103. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-049.md +0 -0
  104. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-050.md +0 -0
  105. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-051.md +0 -0
  106. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-052.md +0 -0
  107. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-061.md +0 -0
  108. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-062.md +0 -0
  109. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-067.md +0 -0
  110. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-069.md +0 -0
  111. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-070.md +0 -0
  112. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-085.md +0 -0
  113. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-087.md +0 -0
  114. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-096.md +0 -0
  115. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-099.md +0 -0
  116. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-107.md +0 -0
  117. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-117.md +0 -0
  118. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-122.md +0 -0
  119. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-123.md +0 -0
  120. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-126.md +0 -0
  121. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-127.md +0 -0
  122. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-130.md +0 -0
  123. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-131.md +0 -0
  124. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/HOTFIX-slim-132.md +0 -0
  125. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-001.md +0 -0
  126. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-002.md +0 -0
  127. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-003.md +0 -0
  128. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-004.md +0 -0
  129. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-005.md +0 -0
  130. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-006.md +0 -0
  131. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-007.md +0 -0
  132. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-008.md +0 -0
  133. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-009.md +0 -0
  134. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-010.md +0 -0
  135. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-011.md +0 -0
  136. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-012.md +0 -0
  137. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-013.md +0 -0
  138. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-014.md +0 -0
  139. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-015.md +0 -0
  140. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-016.md +0 -0
  141. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-017.md +0 -0
  142. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-018.md +0 -0
  143. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-019.md +0 -0
  144. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-020.md +0 -0
  145. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-021.md +0 -0
  146. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-022.md +0 -0
  147. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-023.md +0 -0
  148. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-024.md +0 -0
  149. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-025.md +0 -0
  150. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-026.md +0 -0
  151. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-027.md +0 -0
  152. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-028.md +0 -0
  153. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-029.md +0 -0
  154. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-030.md +0 -0
  155. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-031.md +0 -0
  156. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-032.md +0 -0
  157. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-033.md +0 -0
  158. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-034.md +0 -0
  159. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-035.md +0 -0
  160. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-036.md +0 -0
  161. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-037.md +0 -0
  162. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-038.md +0 -0
  163. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-039.md +0 -0
  164. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-040.md +0 -0
  165. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-041.md +0 -0
  166. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-042.md +0 -0
  167. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-043.md +0 -0
  168. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-044.md +0 -0
  169. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-045.md +0 -0
  170. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-046.md +0 -0
  171. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-047.md +0 -0
  172. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-048.md +0 -0
  173. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-049.md +0 -0
  174. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-050.md +0 -0
  175. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-051.md +0 -0
  176. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-052.md +0 -0
  177. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-053.md +0 -0
  178. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-054.md +0 -0
  179. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-055.md +0 -0
  180. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-056.md +0 -0
  181. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-057.md +0 -0
  182. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-058.md +0 -0
  183. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-059.md +0 -0
  184. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-060.md +0 -0
  185. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-061.md +0 -0
  186. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-062.md +0 -0
  187. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-063.md +0 -0
  188. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-064.md +0 -0
  189. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-065.md +0 -0
  190. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-069.md +0 -0
  191. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-070.md +0 -0
  192. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-071.md +0 -0
  193. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-072.md +0 -0
  194. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-073.md +0 -0
  195. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-001.md +0 -0
  196. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-005.md +0 -0
  197. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-006.md +0 -0
  198. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-007.md +0 -0
  199. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-009.md +0 -0
  200. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-010.md +0 -0
  201. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-011.md +0 -0
  202. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-012.md +0 -0
  203. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-013.md +0 -0
  204. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-014.md +0 -0
  205. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-015.md +0 -0
  206. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-016.md +0 -0
  207. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-017.md +0 -0
  208. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-018.md +0 -0
  209. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-019.md +0 -0
  210. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-020.md +0 -0
  211. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-021.md +0 -0
  212. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-022.md +0 -0
  213. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-023.md +0 -0
  214. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-024.md +0 -0
  215. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-028.md +0 -0
  216. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-029.md +0 -0
  217. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-030.md +0 -0
  218. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-031.md +0 -0
  219. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-032.md +0 -0
  220. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-033.md +0 -0
  221. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-034.md +0 -0
  222. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-035.md +0 -0
  223. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-036.md +0 -0
  224. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-037.md +0 -0
  225. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-038.md +0 -0
  226. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-039.md +0 -0
  227. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-040.md +0 -0
  228. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-041.md +0 -0
  229. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-042.md +0 -0
  230. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-043.md +0 -0
  231. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-044.md +0 -0
  232. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-045.md +0 -0
  233. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-046.md +0 -0
  234. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-047.md +0 -0
  235. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-048.md +0 -0
  236. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-049.md +0 -0
  237. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-050.md +0 -0
  238. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-051.md +0 -0
  239. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-052.md +0 -0
  240. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-053.md +0 -0
  241. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-054.md +0 -0
  242. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-055.md +0 -0
  243. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-056.md +0 -0
  244. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-057.md +0 -0
  245. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-058.md +0 -0
  246. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-059.md +0 -0
  247. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-060.md +0 -0
  248. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-063.md +0 -0
  249. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-066.md +0 -0
  250. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-067.md +0 -0
  251. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-068.md +0 -0
  252. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-069.md +0 -0
  253. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-070.md +0 -0
  254. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-071.md +0 -0
  255. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-072.md +0 -0
  256. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-073.md +0 -0
  257. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-074.md +0 -0
  258. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-075.md +0 -0
  259. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-076.md +0 -0
  260. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-077.md +0 -0
  261. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-078.md +0 -0
  262. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-079.md +0 -0
  263. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-080.md +0 -0
  264. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-081.md +0 -0
  265. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-082.md +0 -0
  266. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-083.md +0 -0
  267. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-084.md +0 -0
  268. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-086.md +0 -0
  269. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-088.md +0 -0
  270. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-089.md +0 -0
  271. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-090.md +0 -0
  272. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-091.md +0 -0
  273. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-092.md +0 -0
  274. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-093.md +0 -0
  275. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-094.md +0 -0
  276. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-095.md +0 -0
  277. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-097.md +0 -0
  278. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-098.md +0 -0
  279. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-099.md +0 -0
  280. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-100.md +0 -0
  281. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-101.md +0 -0
  282. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-102.md +0 -0
  283. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-103.md +0 -0
  284. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-104.md +0 -0
  285. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-105.md +0 -0
  286. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-106.md +0 -0
  287. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-107.md +0 -0
  288. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-108.md +0 -0
  289. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-109.md +0 -0
  290. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-110.md +0 -0
  291. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-111.md +0 -0
  292. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-112.md +0 -0
  293. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-113.md +0 -0
  294. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-114.md +0 -0
  295. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-115.md +0 -0
  296. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-116.md +0 -0
  297. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-118.md +0 -0
  298. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-119.md +0 -0
  299. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-120.md +0 -0
  300. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-121.md +0 -0
  301. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-124.md +0 -0
  302. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-125.md +0 -0
  303. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-126.md +0 -0
  304. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-127.md +0 -0
  305. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-128.md +0 -0
  306. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-129.md +0 -0
  307. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-132.md +0 -0
  308. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-133.md +0 -0
  309. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-134.md +0 -0
  310. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-135.md +0 -0
  311. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-136.md +0 -0
  312. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-137.md +0 -0
  313. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-138.md +0 -0
  314. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-139.md +0 -0
  315. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-140.md +0 -0
  316. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-141.md +0 -0
  317. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-142.md +0 -0
  318. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-143.md +0 -0
  319. {pactkit-2.19.0 → pactkit-2.20.0}/docs/specs/STORY-slim-144.md +0 -0
  320. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/BUG-001_case.md +0 -0
  321. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/BUG-002_case.md +0 -0
  322. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
  323. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
  324. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
  325. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
  326. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
  327. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
  328. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-135_case.md +0 -0
  329. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-136_case.md +0 -0
  330. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-137_case.md +0 -0
  331. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-138_case.md +0 -0
  332. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-139_case.md +0 -0
  333. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-140_case.md +0 -0
  334. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-141_case.md +0 -0
  335. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-142_case.md +0 -0
  336. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-143_case.md +0 -0
  337. {pactkit-2.19.0 → pactkit-2.20.0}/docs/test_cases/STORY-slim-144_case.md +0 -0
  338. {pactkit-2.19.0 → pactkit-2.20.0}/opencode.json +0 -0
  339. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/__main__.py +0 -0
  340. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/audit.py +0 -0
  341. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/backfill.py +0 -0
  342. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/cleaners.py +0 -0
  343. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/commit_gate.py +0 -0
  344. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/config.py +0 -0
  345. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/coverage_gate.py +0 -0
  346. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/deploy_manifest.py +0 -0
  347. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/deps.py +0 -0
  348. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/done_verify.py +0 -0
  349. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/generators/__init__.py +0 -0
  350. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/generators/adapter.py +0 -0
  351. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/guards.py +0 -0
  352. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/id_generator.py +0 -0
  353. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/invariants.py +0 -0
  354. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/issue_sync.py +0 -0
  355. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/lazy_visualize.py +0 -0
  356. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/lessons.py +0 -0
  357. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/lint_runner.py +0 -0
  358. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/observe.py +0 -0
  359. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/__init__.py +0 -0
  360. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/agents.py +0 -0
  361. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/guides.py +0 -0
  362. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/references.py +0 -0
  363. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/rules.py +0 -0
  364. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/prompts/workflows.py +0 -0
  365. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/regression.py +0 -0
  366. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/schemas.py +0 -0
  367. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/scripts.py +0 -0
  368. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/sec_scope.py +0 -0
  369. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/__init__.py +0 -0
  370. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
  371. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  372. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  373. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  374. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  375. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/board.py +0 -0
  376. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/interface_summary.py +0 -0
  377. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/report.py +0 -0
  378. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/scaffold.py +0 -0
  379. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/spec_linter.py +0 -0
  380. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/skills/visualize.py +0 -0
  381. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/spec_graph.py +0 -0
  382. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/spec_status.py +0 -0
  383. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/test_mapper.py +0 -0
  384. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/utils.py +0 -0
  385. {pactkit-2.19.0 → pactkit-2.20.0}/src/pactkit/validators.py +0 -0
  386. {pactkit-2.19.0 → pactkit-2.20.0}/tests/conftest.py +0 -0
  387. {pactkit-2.19.0 → pactkit-2.20.0}/tests/e2e/__init__.py +0 -0
  388. {pactkit-2.19.0 → pactkit-2.20.0}/tests/e2e/cli/__init__.py +0 -0
  389. {pactkit-2.19.0 → pactkit-2.20.0}/tests/e2e/cli/test_cli_e2e.py +0 -0
  390. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  391. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  392. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  393. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  394. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  395. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  396. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
  397. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/copy_claude.json +0 -0
  398. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/copy_claude.yaml +0 -0
  399. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/copy_codex.json +0 -0
  400. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/copy_codex.yaml +0 -0
  401. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/copy_github.json +0 -0
  402. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/copy_github.yaml +0 -0
  403. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/empty.json +0 -0
  404. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/empty.yaml +0 -0
  405. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/full_legacy.json +0 -0
  406. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/full_legacy.yaml +0 -0
  407. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/minimal.json +0 -0
  408. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/minimal.yaml +0 -0
  409. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/unknown_keys.json +0 -0
  410. {pactkit-2.19.0 → pactkit-2.20.0}/tests/fixtures/config_golden/unknown_keys.yaml +0 -0
  411. {pactkit-2.19.0 → pactkit-2.20.0}/tests/integration/__init__.py +0 -0
  412. {pactkit-2.19.0 → pactkit-2.20.0}/tests/integration/test_deploy_classic.py +0 -0
  413. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_agent_features.py +0 -0
  414. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_agent_frontmatter.py +0 -0
  415. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_agents_enrichment.py +0 -0
  416. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_audit.py +0 -0
  417. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_blast_radius.py +0 -0
  418. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_board_bug027.py +0 -0
  419. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_board_sections.py +0 -0
  420. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug001_skill_path.py +0 -0
  421. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
  422. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug003_multi_import.py +0 -0
  423. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug004_dead_set.py +0 -0
  424. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
  425. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
  426. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  427. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  428. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug009_project_config_backfill.py +0 -0
  429. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -0
  430. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug011_stale_refs.py +0 -0
  431. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  432. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug013_config_single_source.py +0 -0
  433. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
  434. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  435. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  436. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
  437. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  438. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug025_release_delegation.py +0 -0
  439. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug026_version_sync.py +0 -0
  440. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
  441. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  442. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  443. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  444. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  445. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_021.py +0 -0
  446. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_022.py +0 -0
  447. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_023.py +0 -0
  448. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_024.py +0 -0
  449. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  450. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  451. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_slim003.py +0 -0
  452. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_slim004.py +0 -0
  453. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_slim005.py +0 -0
  454. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_slim006.py +0 -0
  455. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  456. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_check_command.py +0 -0
  457. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_check_extensions_072_073.py +0 -0
  458. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_check_playbook_072_073.py +0 -0
  459. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_command_frontmatter.py +0 -0
  460. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_command_visualize_modes.py +0 -0
  461. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_commit_gate.py +0 -0
  462. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_complexity.py +0 -0
  463. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_config.py +0 -0
  464. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_config_auto_merge.py +0 -0
  465. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_constitution_sharpening.py +0 -0
  466. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_create_skill.py +0 -0
  467. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_cross_flow_matrix.py +0 -0
  468. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_deploy_base.py +0 -0
  469. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_deployer_cleanup.py +0 -0
  470. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_deployer_plugin.py +0 -0
  471. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_deps.py +0 -0
  472. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_design_command.py +0 -0
  473. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_done_gates.py +0 -0
  474. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_done_verify.py +0 -0
  475. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_draw_prompt.py +0 -0
  476. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_draw_references.py +0 -0
  477. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_drawio_mcp.py +0 -0
  478. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_garden.py +0 -0
  479. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_home_path_fix.py +0 -0
  480. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_hotfix_command.py +0 -0
  481. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_init_guard.py +0 -0
  482. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_init_playbook_074.py +0 -0
  483. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_interface_summary.py +0 -0
  484. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_lang_profiles.py +0 -0
  485. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_layer_violations.py +0 -0
  486. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_lessons_rotation_075.py +0 -0
  487. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_list_stories.py +0 -0
  488. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_mcp_integration.py +0 -0
  489. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_model_config.py +0 -0
  490. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_modular_constitution.py +0 -0
  491. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_monorepo_detect.py +0 -0
  492. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_multi_prefix.py +0 -0
  493. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_observe.py +0 -0
  494. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_pdca_slim.py +0 -0
  495. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_profiles.py +0 -0
  496. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_project_visibility.py +0 -0
  497. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_prompt_cli_refs.py +0 -0
  498. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_prompt_quality_075.py +0 -0
  499. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_prompt_structural_invariants.py +0 -0
  500. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_prompts_package.py +0 -0
  501. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_release.py +0 -0
  502. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_release_field.py +0 -0
  503. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_release_v110.py +0 -0
  504. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_render_prompt.py +0 -0
  505. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_report_parser.py +0 -0
  506. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_report_unified.py +0 -0
  507. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_review_command.py +0 -0
  508. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_rules_enrichment.py +0 -0
  509. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_scaffold.py +0 -0
  510. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  511. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_schemas.py +0 -0
  512. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_script_extraction.py +0 -0
  513. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_selective_deploy.py +0 -0
  514. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_session_context.py +0 -0
  515. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_skill_structure.py +0 -0
  516. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_skills_enrichment.py +0 -0
  517. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_slim_deps_088.py +0 -0
  518. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_smart_regression.py +0 -0
  519. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_solution_design_rule.py +0 -0
  520. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_sprint_command.py +0 -0
  521. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_stack_references.py +0 -0
  522. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_status_command.py +0 -0
  523. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_statusline.py +0 -0
  524. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story014_release.py +0 -0
  525. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  526. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story016_claude_md.py +0 -0
  527. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story017_init_claude_md.py +0 -0
  528. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story018_arch_staleness.py +0 -0
  529. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story019_bailout.py +0 -0
  530. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story020_horizon.py +0 -0
  531. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story021_rfc.py +0 -0
  532. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story022_decision_tree.py +0 -0
  533. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story023_test_quality.py +0 -0
  534. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story024_native_agent.py +0 -0
  535. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
  536. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story026_issue_tracker.py +0 -0
  537. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story028_rule_scoping.py +0 -0
  538. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story029_doctor.py +0 -0
  539. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story030_lint.py +0 -0
  540. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story031_git_init_guard.py +0 -0
  541. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  542. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story033_config_backfill.py +0 -0
  543. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story034_plan_config_refresh.py +0 -0
  544. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story035_readme_docs.py +0 -0
  545. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story037_regression_fix.py +0 -0
  546. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story038_call_graph_update.py +0 -0
  547. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story039_venv_config.py +0 -0
  548. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
  549. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story042_spec_linter.py +0 -0
  550. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story043_active_clarify.py +0 -0
  551. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story044_consistency_check.py +0 -0
  552. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story045_auto_pr.py +0 -0
  553. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story046_agent_adapter.py +0 -0
  554. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
  555. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
  556. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story049_community_standards.py +0 -0
  557. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  558. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  559. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
  560. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story053_impact_regression.py +0 -0
  561. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story055_commands.py +0 -0
  562. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story055_config.py +0 -0
  563. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story055_spec_linter.py +0 -0
  564. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story056_commands.py +0 -0
  565. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story056_config.py +0 -0
  566. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  567. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
  568. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story058_routing_fix.py +0 -0
  569. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story060_init_hang.py +0 -0
  570. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story061_remove_thinking.py +0 -0
  571. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  572. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story064_venv_local_md.py +0 -0
  573. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story065_sprint_model.py +0 -0
  574. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story072_developer_prefix.py +0 -0
  575. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story106_lateral_scan.py +0 -0
  576. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story133_debug_skill.py +0 -0
  577. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim009_lazy_rules.py +0 -0
  578. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  579. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim011_command_rules.py +0 -0
  580. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim012_ci.py +0 -0
  581. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_clean.py +0 -0
  582. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_context.py +0 -0
  583. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_guard.py +0 -0
  584. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  585. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_next_id.py +0 -0
  586. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_regression.py +0 -0
  587. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  588. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim014_validators.py +0 -0
  589. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim015_doctor.py +0 -0
  590. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  591. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim017.py +0 -0
  592. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim018.py +0 -0
  593. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  594. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  595. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim021.py +0 -0
  596. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim022.py +0 -0
  597. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim023.py +0 -0
  598. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim024.py +0 -0
  599. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim025.py +0 -0
  600. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim026.py +0 -0
  601. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim027.py +0 -0
  602. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim028.py +0 -0
  603. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim029.py +0 -0
  604. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim030.py +0 -0
  605. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim031.py +0 -0
  606. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim032.py +0 -0
  607. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim033.py +0 -0
  608. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim034.py +0 -0
  609. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim035.py +0 -0
  610. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim036.py +0 -0
  611. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim037.py +0 -0
  612. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim038.py +0 -0
  613. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim039.py +0 -0
  614. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim040.py +0 -0
  615. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim041.py +0 -0
  616. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim042.py +0 -0
  617. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim043.py +0 -0
  618. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim044.py +0 -0
  619. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim045.py +0 -0
  620. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim046.py +0 -0
  621. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim047.py +0 -0
  622. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim048.py +0 -0
  623. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim049.py +0 -0
  624. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim051.py +0 -0
  625. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim052.py +0 -0
  626. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim053.py +0 -0
  627. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim054.py +0 -0
  628. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim055.py +0 -0
  629. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim056.py +0 -0
  630. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  631. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim063.py +0 -0
  632. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim065.py +0 -0
  633. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim076_multistack.py +0 -0
  634. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  635. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim078.py +0 -0
  636. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim079.py +0 -0
  637. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim080.py +0 -0
  638. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim081.py +0 -0
  639. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim082.py +0 -0
  640. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim083.py +0 -0
  641. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim095.py +0 -0
  642. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim098_pdca_nudge.py +0 -0
  643. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  644. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim102_version_marker.py +0 -0
  645. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim104_should_semantics.py +0 -0
  646. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim107.py +0 -0
  647. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim109_journey_spec.py +0 -0
  648. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim111_playwright_assertion.py +0 -0
  649. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim112_rules_split.py +0 -0
  650. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim114_journey_sync.py +0 -0
  651. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim119.py +0 -0
  652. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim120.py +0 -0
  653. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim121.py +0 -0
  654. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim125.py +0 -0
  655. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim126.py +0 -0
  656. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim127_managed_block.py +0 -0
  657. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim128_engineering_concerns.py +0 -0
  658. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim132.py +0 -0
  659. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim134_no_model_in_frontmatter.py +0 -0
  660. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim135_config_schema.py +0 -0
  661. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim139_skill_manifest.py +0 -0
  662. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim141_manifest_hash.py +0 -0
  663. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim143_spec_graph.py +0 -0
  664. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_story_slim144_wave_mode.py +0 -0
  665. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_tools.py +0 -0
  666. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_topology_parsers_066.py +0 -0
  667. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_update_task.py +0 -0
  668. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_visualize_call_nested.py +0 -0
  669. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_visualize_chain_fix.py +0 -0
  670. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_visualize_modes.py +0 -0
  671. {pactkit-2.19.0 → pactkit-2.20.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -58,6 +58,7 @@ pactkit-plugin/
58
58
  # Backup
59
59
  *.bak
60
60
  .mcp.json
61
+ .pactkit/
61
62
  coder/
62
63
  docker/
63
64
  docs/slides/
@@ -4,6 +4,14 @@ 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.20.0] - 2026-08-22
8
+
9
+ ### Added
10
+ - **Verified resumable Act checkpoints** (STORY-slim-146) — PactKit now persists Story-scoped continuation state with validated Spec, Board, test, regression, and lint evidence. `pactkit continuation status/verify/resume/checkpoint` supports safe cross-process recovery, stale-state detection, terminal completion, fresh-cycle archival, secret/path sanitization, and Story-level locking. All 13 runtime skills and the Classic, OpenCode, Codex, and Copilot deployments share the recovery contract.
11
+
12
+ ### Fixed
13
+ - **Adapter-safe command rendering and deployment gates** (STORY-slim-145) — operation-aware prompt rendering preserves PactKit CLI semantics across adapters, rejects lossy command transformations, checks generated prompt integrity before writing, and blocks incompatible Core/adapter versions unless skew is explicitly acknowledged.
14
+
7
15
  ## [2.19.0] - 2026-08-17
8
16
 
9
17
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: pactkit
3
- Version: 2.19.0
3
+ Version: 2.20.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
@@ -194,7 +194,7 @@ Or run the full cycle in one command:
194
194
  | **Done** | `/project-done` | Repo Maintainer | Regression gate -> Archive -> Conventional commit |
195
195
  | **Release** | `/project-release` | Repo Maintainer | Version bump -> Snapshot -> Git tag -> GitHub Release |
196
196
  | **PR** | `/project-pr` | Repo Maintainer | Push branch -> Create pull request via gh CLI |
197
- | **Sprint** | `/project-sprint` | Team Lead | One-command automated PDCA orchestration |
197
+ | **Sprint** | `/project-sprint` | Team Lead | One-command automated PDCA orchestration; empty args = Wave Mode (parallel backlog stories via `spec-graph` waves + conflict matrix) |
198
198
  | **Hotfix** | `/project-hotfix` | Senior Developer | Fast-track fix bypassing PDCA (with traceability) |
199
199
  | **Init** | `/project-init` | System Architect | Bootstrap project structure and governance |
200
200
  | **Design** | `/project-design` | Product Designer | PRD generation -> Story decomposition -> Board setup |
@@ -290,7 +290,8 @@ PactKit ships 36 deterministic CLI subcommands — operations that were previous
290
290
  | `pactkit version` | Show installed version |
291
291
  | `pactkit schema` | Print document schemas |
292
292
  | `pactkit doctor` | Diagnose project health (HLD drift, board, config, deployment content parity, adapter skew) |
293
- | `pactkit spec-lint` | Validate spec structure (14 rules: E001-E008, W001-W006) |
293
+ | `pactkit spec-lint` | Validate spec structure (E001-E010, W001-W011; incl. dependency surface checks) |
294
+ | `pactkit spec-graph` | Story dependency DAG: topological execution waves + file-conflict matrix (`--json` for orchestrators, `--write-graph` for Mermaid) |
294
295
  | `pactkit spec-status` | Update spec Status field (Draft/In Progress/Done) |
295
296
  | `pactkit guard` | Check project init markers |
296
297
  | `pactkit next-id` | Generate next Story/Bug ID |
@@ -149,7 +149,7 @@ Or run the full cycle in one command:
149
149
  | **Done** | `/project-done` | Repo Maintainer | Regression gate -> Archive -> Conventional commit |
150
150
  | **Release** | `/project-release` | Repo Maintainer | Version bump -> Snapshot -> Git tag -> GitHub Release |
151
151
  | **PR** | `/project-pr` | Repo Maintainer | Push branch -> Create pull request via gh CLI |
152
- | **Sprint** | `/project-sprint` | Team Lead | One-command automated PDCA orchestration |
152
+ | **Sprint** | `/project-sprint` | Team Lead | One-command automated PDCA orchestration; empty args = Wave Mode (parallel backlog stories via `spec-graph` waves + conflict matrix) |
153
153
  | **Hotfix** | `/project-hotfix` | Senior Developer | Fast-track fix bypassing PDCA (with traceability) |
154
154
  | **Init** | `/project-init` | System Architect | Bootstrap project structure and governance |
155
155
  | **Design** | `/project-design` | Product Designer | PRD generation -> Story decomposition -> Board setup |
@@ -245,7 +245,8 @@ PactKit ships 36 deterministic CLI subcommands — operations that were previous
245
245
  | `pactkit version` | Show installed version |
246
246
  | `pactkit schema` | Print document schemas |
247
247
  | `pactkit doctor` | Diagnose project health (HLD drift, board, config, deployment content parity, adapter skew) |
248
- | `pactkit spec-lint` | Validate spec structure (14 rules: E001-E008, W001-W006) |
248
+ | `pactkit spec-lint` | Validate spec structure (E001-E010, W001-W011; incl. dependency surface checks) |
249
+ | `pactkit spec-graph` | Story dependency DAG: topological execution waves + file-conflict matrix (`--json` for orchestrators, `--write-graph` for Mermaid) |
249
250
  | `pactkit spec-status` | Update spec Status field (Draft/In Progress/Done) |
250
251
  | `pactkit guard` | Check project init markers |
251
252
  | `pactkit next-id` | Generate next Story/Bug ID |
@@ -3,3 +3,4 @@
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
5
  | 2026-04-01 | Graduated safety language: retire MANDATORY keyword across prompts/commands.py, workflows.py, skills.py — use CRITICAL for safety gates (T1) and MUST for required steps (T2). Consistency prevents AI from treating all-caps keywords as equally urgent. | prompts/commands.py:MANDATORY→MUST/CRITICAL |
6
+ | 2026-04-01 | Multi-stack visualize: _detect_stack() returning single str masks Go/TS/Java files in mixed projects; _build_class_graph hardcoded ast.parse() silently skips non-Python via except. Fix: _detect_stacks() returns list, extract_classes() ABC on all 4 analyzers. | visualize.py:_detect_stacks,_build_class_graph |
@@ -2,7 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-04-01 | Multi-stack visualize: _detect_stack() returning single str masks Go/TS/Java files in mixed projects; _build_class_graph hardcoded ast.parse() silently skips non-Python via except. Fix: _detect_stacks() returns list, extract_classes() ABC on all 4 analyzers. | visualize.py:_detect_stacks,_build_class_graph |
6
5
  | 2026-04-01 | Monorepo stack detection requires depth-1 subdir scan; cleaners.py and visualize.py _STACK_MARKERS must scan root/* not just root | cleaners.py:detect_stacks |
7
6
  | 2026-04-01 | When splitting a monolithic file into submodules with deploy-time inlining via load_script(), relative imports (from .foo) in exec() context raise KeyError not ImportError — guard with except (ImportError, KeyError) | skills/__init__.py:load_script |
8
7
  | 2026-04-01 | TSAnalyzer._load_tsconfig_paths must search depth-1 subdirs like _detect_stacks does because visualize.py always passes monorepo root as root param, not stack subdir — tsconfig in frontend/ is invisible if only root is searched | src/pactkit/skills/analyzers/ts_analyzer.py:_load_tsconfig_paths |
@@ -53,3 +52,4 @@
53
52
  | 2026-08-17 | deploy(format=all) 的 adapter 分支无视 target 直写真实 home——跨环境副作用必须显式审查 target/HOME 语义;测试通过 subprocess 调 CLI 时 HOME 未隔离即真实机器 | deployer.py:deploy |
54
53
  | 2026-08-17 | Baseline budget tests (test_story063_prompt_slimming.py BASELINE_TOTAL_CHARS) leave <100 chars headroom — new playbook instructions must compress hard or bump baseline with justification comment | pactkit/prompts/commands.py |
55
54
  | 2026-08-17 | pactkit update only deploys to ~/.claude — in-repo pactkit-plugin/commands copies need manual sync from prompts/ source (verified by normalized diff) | pactkit/prompts/workflows.py:SPRINT_PROMPT |
55
+ | 2026-08-22 | Continuation completion must validate real Spec/Board/test evidence and keep read-validate-write under a Story-level process lock; prompt-only evidence is insufficient. | src/pactkit/continuation.py:ContinuationStore |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 4183+ tests must pass before any commit to `main`.
18
+ 1. All 4271+ 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`.
@@ -84,3 +84,12 @@
84
84
  - [x] SPRINT_PROMPT wave mode section R2-R5
85
85
  - [x] regenerate deployed sprint playbook
86
86
  - [x] prompt content tests AC3-AC6
87
+
88
+ ### [STORY-slim-146] 全 Skill 可恢复执行契约与 Act 断点续作
89
+ > Spec: docs/specs/STORY-slim-146.md
90
+
91
+ - [x] 建立 13 个 runtime skill 的恢复契约与完整性校验
92
+ - [x] 实现原子 continuation checkpoint、验证与安全 resume CLI
93
+ - [x] 为 project-act 加入逐步 checkpoint 与完成覆盖门禁
94
+ - [x] 接入 doctor/garden/status 诊断并验证 legacy 兼容
95
+ - [x] 验证四种 format 与外部 adapter 的真实 project-act 部署 parity
@@ -1,11 +1,11 @@
1
1
  # Project Context (Auto-generated)
2
- > Last updated: 2026-08-17T17:57:13+08:00 by pactkit context
2
+ > Last updated: 2026-08-22T08:48:25+08:00 by pactkit context
3
3
 
4
4
  ## Sprint Status
5
- Backlog: 5 | In Progress: 0 | Done: 0 stories
5
+ Backlog: 5 | In Progress: 1 | Done: 0 stories
6
6
 
7
7
  ## Current Stories
8
- None
8
+ - STORY-slim-145: Codex 部署命令语义完整性与 Adapter 兼容门禁
9
9
 
10
10
  ## Recent Completions
11
11
  None
@@ -16,14 +16,14 @@ None
16
16
  * main
17
17
 
18
18
  ## Key Decisions
19
- - 门禁词表扫描须先剥离 code fence/inline code span(done_verify.py:_strip_code_spans),否则词表元讨论自身误报
20
19
  - check_deploy_parity 新增 hash 路径漏了 SEC-7 降级守卫(PermissionError/AttributeError 穿透 doctor)——Spec Security Scope 逐条自查 + 独立评审实重现能抓作者盲区
21
20
  - deploy(format=all) 的 adapter 分支无视 target 直写真实 home——跨环境副作用必须显式审查 target/HOME 语义;测试通过 subprocess 调 CLI 时 HOME 未隔离即真实机器
22
21
  - Baseline budget tests (test_story063_prompt_slimming.py BASELINE_TOTAL_CHARS) leave <100 chars headroom — new playbook instructions must compress hard or bump baseline with justification comment
23
22
  - pactkit update only deploys to ~/.claude — in-repo pactkit-plugin/commands copies need manual sync from prompts/ source (verified by normalized diff)
23
+ - Continuation completion must validate real Spec/Board/test evidence and keep read-validate-write under a Story-level process lock; prompt-only evidence is insufficient.
24
24
 
25
25
  ## Next Recommended Action
26
- `/project-plan`
26
+ `/project-act` (stories in progress)
27
27
 
28
28
  ## Agent Continuation
29
29
  No active work session.
@@ -38,5 +38,13 @@
38
38
 
39
39
  ## 🔄 In Progress
40
40
 
41
- ## ✅ Done
41
+ ### [STORY-slim-145] Codex 部署命令语义完整性与 Adapter 兼容门禁
42
+ > Spec: docs/specs/STORY-slim-145.md
43
+
44
+ - [x] 建立 CLI policy 与结构化操作渲染契约
45
+ - [x] 移除 pactkit-codex 有损命令前缀替换
46
+ - [x] 增加 prompt 完整性与 Classic/Codex parity 门禁
47
+ - [x] 阻止不兼容 Core/adapter 组合静默部署
48
+ - [ ] 完成隔离迁移、双仓回归与同版本发布验证
42
49
 
50
+ ## ✅ Done
@@ -0,0 +1,289 @@
1
+ # STORY-slim-145: Codex 部署命令语义完整性与 Adapter 兼容门禁
2
+
3
+ | Field | Value |
4
+ |-------|-------|
5
+ | ID | STORY-slim-145 |
6
+ | Status | Draft |
7
+ | Priority | P0 |
8
+ | Release | 2.20.0 |
9
+
10
+ ## Background
11
+
12
+ PactKit Core 2.19.0 与已安装的 `pactkit-codex` 2.17.0 组合部署后,Codex 的 `project-act/SKILL.md` 出现了确定性的语义损坏。Core 将 Codex profile 固定标记为 `has_pactkit_cli=False`,adapter 随后通过 `_replace_cli_with_scripts()` 对 Markdown 正文执行前缀级 `str.replace()`。该转换没有消费完整代码 span 和参数,导致下列有效命令被改写成无效或歧义文本:
13
+
14
+ ```text
15
+ Run `pactkit regression` ...
16
+ → Run run the full test suite directly (...)` ...
17
+
18
+ Run `pactkit context --continuation ...`
19
+ → Run update `docs/product/context.md` manually --continuation ...
20
+ ```
21
+
22
+ 相同转换同时作用于 rules、command skills 与 embedded skills,因此问题不局限于 `$project-act`。本机 Codex 实际具备 shell 且 `pactkit` 在 PATH 中,说明“Codex 格式”并不等价于“运行时没有 PactKit CLI”。当前 adapter 的依赖也声明 `pactkit>=2.17.0`,与无条件移除 PactKit CLI 指令的行为矛盾。
23
+
24
+ 现有 deploy-output guard 只检查外部路径和 CLI 字符串是否残留,不检查转换后的 Markdown 是否语法完整、关键工作流步骤是否保留,也不阻止旧 adapter 配新 Core 继续部署。这使损坏内容可以通过测试并进入 `~/.codex/skills/`。
25
+
26
+ 本 Story 修复部署语义与版本兼容边界,不实现 Act 的跨 turn 持久化状态机。后者需要独立 Story。
27
+
28
+ ## Target Call Chain
29
+
30
+ ```text
31
+ pactkit init/update --format codex
32
+ -> cli.py
33
+ -> generators/deployer.py: deploy()
34
+ -> entry point pactkit.deployers[codex]
35
+ -> pactkit_codex.deployer: CodexDeployer.deploy()
36
+ -> deploy_codex_rules()
37
+ -> deploy_codex_command_skills()
38
+ -> deploy_codex_skills()
39
+ -> _render_prompt()
40
+ -> _replace_cli_with_scripts() # 当前有损转换点
41
+ -> DeployerBase.validate_deployed_content()
42
+ -> atomic_write(SKILL.md/rules)
43
+
44
+ Codex runtime
45
+ -> user invokes $project-act STORY-XXX
46
+ -> loads ~/.codex/skills/project-act/SKILL.md
47
+ -> model executes deployed Phase 0..4 instructions
48
+ ```
49
+
50
+ ## Dependency Surface
51
+
52
+ | Field | Value |
53
+ |-------|-------|
54
+ | Depends on | STORY-slim-084, STORY-slim-139, STORY-slim-142 |
55
+ | Provides | Structured operation rendering, prompt-integrity validation, and adapter compatibility gate |
56
+ | Touches | Core deployment/profile/version dispatch plus external `../pactkit-codex` and `../pactkit-copilot` rendering and tests |
57
+ | Conflict risk | High — both repositories share `FormatProfile`, `_render_prompt()`, `DeployerBase`, and adapter entry-point contracts |
58
+
59
+ ## Requirements
60
+
61
+ ### R1: 将 CLI 可用性建模为部署策略而非固定格式事实 (MUST)
62
+
63
+ Core MUST replace or extend the boolean `FormatProfile.has_pactkit_cli` with a policy that can distinguish at least:
64
+
65
+ - `required`: generated workflow relies on PactKit CLI;
66
+ - `preferred`: preserve PactKit CLI commands, with an explicit whole-operation fallback when unavailable;
67
+ - `unavailable`: generated workflow must not require PactKit CLI.
68
+
69
+ Codex MUST use `preferred`; Classic MUST use `required` or an equivalent CLI-preserving policy; Copilot MAY remain `unavailable`. Existing third-party profiles that omit the new field MUST retain a documented backward-compatible default.
70
+
71
+ The policy MUST describe deploy-output behavior only. It MUST NOT claim that a product format is permanently sandboxed or infer the current process PATH during module import.
72
+
73
+ ### R2: 为 PactKit 操作提供结构化渲染契约 (MUST)
74
+
75
+ Core MUST expose named prompt variables or an equivalent structured operation map for operations currently rewritten from free text, including at least:
76
+
77
+ - regression classification;
78
+ - lint;
79
+ - context continuation update;
80
+ - cleanup;
81
+ - lazy visualization;
82
+ - installation/update guidance;
83
+ - guard;
84
+ - doctor.
85
+
86
+ Source command templates MUST reference those structured operations. Adapter code MUST NOT discover these operations by matching arbitrary natural-language prefixes such as `` `pactkit regression``.
87
+
88
+ For CLI-preserving profiles, rendered commands MUST retain the exact supported PactKit CLI invocation. For CLI-unavailable profiles, a fallback MUST replace the complete operation token or complete code span, including arguments and closing delimiter.
89
+
90
+ ### R3: Codex 与 Copilot adapter 停止有损/本地 CLI 前缀替换 (MUST)
91
+
92
+ > Scope 扩大至 Copilot:Act Phase 0 用户授权(OpenCode 因 `has_pactkit_cli=True` 无 CLI fallback,不适用,排除在外)。
93
+
94
+ `pactkit-codex` MUST remove the current prefix-based `_CLI_TO_SCRIPT` replacements for `pactkit regression`, `lint`, `context`, `clean`, `visualize`, `guard`, `doctor`, and `update`, or replace them with the structured contract from R2. `pactkit-copilot` MUST likewise remove its local `content.replace()` CLI fallback table (copilot deployer.py:640-) and consume the R2 structured contract. Codex 产生过实证损坏(`Run run`、参数游离);Copilot 虽未产生双 Run,但其 `--continuation` 等参数仍可游离,且 local fallback table 违反 R2 的"adapter MUST NOT match natural-language prefixes"。
95
+
96
+ Codex deployment MUST continue to perform genuine format conversions:
97
+
98
+ - Claude/OpenCode paths to Codex paths;
99
+ - `/project-*` references to `$project-*`;
100
+ - unsupported frontmatter removal;
101
+ - Claude/Anthropic model-brand cleanup.
102
+
103
+ These transformations MUST preserve all command arguments and surrounding Markdown. A fallback MUST be operation-equivalent; for example, `pactkit regression` MUST NOT silently become an unconditional full-suite command because that loses SKIP/IMPACT/FULL classification.
104
+
105
+ ### R4: 增加部署内容语法与工作流语义门禁 (MUST)
106
+
107
+ Core MUST extend deploy-output validation, or add a dedicated prompt-integrity validator, to detect at least:
108
+
109
+ - duplicated imperative fragments such as `Run run`;
110
+ - unbalanced Markdown backticks introduced by deployment;
111
+ - CLI options appended to prose fallback, such as `manually --continuation`;
112
+ - unresolved known template variables;
113
+ - missing required Act workflow capabilities.
114
+
115
+ For `project-act`, the validator MUST verify the presence of semantic steps for Spec lint, TDD RED/GREEN, regression classification, lint, continuation update, and Requirement coverage output. Validation MUST compare normalized operations rather than require identical Claude and Codex prose.
116
+
117
+ Release/deployment tests MUST treat syntax corruption or a missing MUST workflow capability as failure, not warning. Foreign-path diagnostics MAY remain warnings where existing compatibility requires it.
118
+
119
+ ### R5: 建立 Claude 与 Codex 的规范化行为等价测试 (MUST)
120
+
121
+ Tests MUST render the canonical `project-act` workflow for Classic and Codex, normalize environment-specific paths, invocation prefixes, and frontmatter, then assert that their required operation sets are equivalent.
122
+
123
+ The test MUST fail if Codex loses any required phase or operation even when all forbidden raw strings have disappeared. It MUST include regression cases for the exact previously observed corruptions.
124
+
125
+ ### R6: Adapter/Core 版本兼容成为部署前门禁 (MUST)
126
+
127
+ Core MUST extend the existing `doctor.check_adapter_skew()` (delivered by STORY-slim-142, currently report-only) with a deploy-time gate, not replace it. Before `pactkit init/update` invokes an external adapter, Core MUST compare the runtime Core version with the adapter distribution version. Major/minor mismatch MUST block that adapter deployment with an actionable error unless an explicit escape hatch such as `--allow-adapter-skew` is supplied. Patch-only mismatch MAY warn.
128
+
129
+ The check MUST also detect divergence between `pactkit.__version__` and `importlib.metadata.version("pactkit")`, because editable installs can otherwise report one source version and another distribution version. Metadata lookup failures MUST degrade to an actionable diagnostic without crashing unrelated Classic deployment.
130
+
131
+ Adapter package dependencies SHOULD constrain compatible Core versions, for example `pactkit>=2.20,<2.21`, instead of accepting all future Core versions.
132
+
133
+ ### R7: 安全迁移并验证现有 Codex 部署 (MUST)
134
+
135
+ After Core and `pactkit-codex` are released at the same compatible version, the migration procedure MUST:
136
+
137
+ 1. install the aligned adapter without overwriting user-owned `~/.codex/config.toml`;
138
+ 2. regenerate managed Codex skills and rules;
139
+ 3. run `pactkit doctor`;
140
+ 4. scan deployed content for known corruption signatures;
141
+ 5. verify a disposable `$project-act` fixture reaches its final coverage output or an explicit legitimate blocker.
142
+
143
+ No test or migration command may write to a real user home when a temporary target is supplied.
144
+
145
+ ### R8: Preserve existing interfaces and user-owned configuration (MUST)
146
+
147
+ - Existing `$project-*` invocation names MUST remain unchanged.
148
+ - Existing `pactkit init/update` CLI signatures MUST remain compatible except for the optional skew override.
149
+ - Existing `config.toml` MUST remain byte-identical during adapter deployment.
150
+ - Classic and OpenCode output MUST not regress.
151
+ - The Core repository MUST NOT vendor the `pactkit-codex` implementation; the adapter remains an external package using the shared contract.
152
+
153
+ ## Acceptance Criteria
154
+
155
+ ### AC1: Codex Act 不再生成损坏文本 (R2, R3, R4)
156
+
157
+ - **Given** canonical `project-act` template and the Codex profile
158
+ - **When** `CodexDeployer.deploy_codex_command_skills()` renders it into a temporary directory
159
+ - **Then** output contains none of `Run run`, `Run update`, `manually --continuation`, or unbalanced backticks, and all command arguments remain attached to an executable operation
160
+
161
+ ### AC2: Codex 保留 PactKit CLI 的确定性语义 (R1, R2, R3)
162
+
163
+ - **Given** Codex uses the `preferred` CLI policy
164
+ - **When** command and rule content are rendered
165
+ - **Then** `pactkit regression`, `pactkit lint`, `pactkit context --continuation`, `pactkit clean`, and lazy visualization retain their canonical semantics, with any fallback expressed as a complete conditional operation rather than partial prose substitution
166
+
167
+ ### AC3: Classic/Codex Act 行为等价 (R4, R5)
168
+
169
+ - **Given** Classic and Codex deployments from the same Core templates
170
+ - **When** a test extracts and normalizes their required Act operations
171
+ - **Then** both contain Spec lint, TDD RED/GREEN, regression classification, lint, continuation update, graph synchronization, Board update, and Requirement coverage output
172
+
173
+ ### AC4: 语义损坏阻止部署测试通过 (R4)
174
+
175
+ - **Given** fixtures containing each historical corruption signature or with one required Act operation removed
176
+ - **When** prompt-integrity validation runs
177
+ - **Then** each fixture returns a deterministic failure identifying the file and violated invariant
178
+
179
+ ### AC5: Adapter 版本错配不再静默部署 (R6)
180
+
181
+ - **Given** Core 2.20.x and `pactkit-codex` 2.19.x are installed
182
+ - **When** `pactkit update --format codex` runs
183
+ - **Then** Codex deployment is blocked before managed files are written, the error names both versions and the upgrade command, while Classic deployment remains available
184
+
185
+ ### AC6: Editable install 元数据分裂可见 (R6)
186
+
187
+ - **Given** imported `pactkit.__version__` differs from distribution metadata
188
+ - **When** compatibility validation or `pactkit doctor` runs
189
+ - **Then** output explicitly reports source/distribution divergence and does not claim the installation is aligned
190
+
191
+ ### AC7: 对齐版本后的迁移安全 (R7, R8)
192
+
193
+ - **Given** a temporary Codex home with an existing `config.toml` sentinel
194
+ - **When** aligned Core/adapter deployment and migration verification run
195
+ - **Then** `config.toml` is byte-identical, managed files are regenerated, doctor reports no adapter skew/content corruption, and no writes occur outside the temporary target
196
+
197
+ ### AC8: 回归兼容 (R8)
198
+
199
+ - **Given** the completed implementation across core, codex, and copilot repositories
200
+ - **When** Core and adapter targeted/full test suites and linters run
201
+ - **Then** all pre-existing tests pass without weakening existing assertions, and Classic/OpenCode deployment snapshots remain semantically unchanged
202
+
203
+ ### AC9: Copilot 消费共享 operation 契约 (R2, R3)
204
+
205
+ - **Given** canonical `project-act` template and the Copilot profile (CLI-unavailable, `has_pactkit_cli=False`)
206
+ - **When** `CopilotDeployer` renders it into a temporary directory
207
+ - **Then** Copilot no longer maintains a local CLI fallback `content.replace()` table, rendered commands resolve via the Core R2 operation tokens, command arguments remain attached to an executable operation, and no `--continuation`-style option is left stranded in prose
208
+
209
+ ## Technical Design
210
+
211
+ ### Lateral Scan Results
212
+
213
+ - Operation: environment-specific prompt rendering and CLI fallback conversion
214
+ - Existing implementations: at least three independent paths — Core `_render_prompt()`, Codex `_replace_cli_with_scripts()`, and Copilot/OpenCode adapter-specific replacements
215
+ - Assessment: extract a shared structured operation contract in Core. Adding another adapter-local replacement table would deepen an already demonstrated drift pattern and violate the project's shared-abstraction threshold.
216
+
217
+ ### Capability model
218
+
219
+ Prefer a small enum-like policy over additional format-name branches. `_render_prompt()` remains the single environment rendering boundary. It exposes structured operation variables (`{PACTKIT_OP_*}` in its existing `var_map`, deployer.py:71) as the canonical contract, AND — as the equivalent structured operation map permitted by R2 ("or equivalent") — performs safe complete code-span replacement of canonical `pactkit` CLI commands with fallback operations for CLI-unavailable profiles (`has_pactkit_cli=False`). Source templates may use either `{PACTKIT_OP_*}` tokens or hardcoded CLI code spans; both resolve correctly (token path via var_map, hardcoded path via Core replace). Adapter packages MUST NOT maintain local prefix-replacement tables (R3) — fallback rendering is Core-owned, never adapter-local.
220
+
221
+ Runtime PATH probing SHOULD occur only as an explicit preflight instruction or CLI command, not while importing profiles. Normal Codex installation includes PactKit as an adapter dependency, so the generated default SHOULD preserve the canonical CLI path.
222
+
223
+ ### Prompt integrity
224
+
225
+ Validation should have two layers:
226
+
227
+ 1. lexical integrity: malformed Markdown and known corruption signatures;
228
+ 2. semantic integrity: required operation IDs extracted from canonical markers or structured tokens.
229
+
230
+ Operation IDs are preferable to English sentence matching. Example conceptual marker: `PACTKIT_OP:context_continuation`; deployment may render different user-facing text while tests compare the same operation identity.
231
+
232
+ ### Version compatibility
233
+
234
+ Compatibility checking belongs in Core immediately before adapter invocation because Core owns entry-point dispatch. It MUST reuse `doctor.check_adapter_skew()` (STORY-slim-142) as the metadata-reading layer and add two new layers on top: (1) a deploy-time block with `--allow-adapter-skew` override, and (2) editable-install divergence detection comparing `pactkit.__version__` against `importlib.metadata.version("pactkit")` (AC6). Adapter dependency bounds provide a second layer but cannot replace runtime validation in editable or partially upgraded installations.
235
+
236
+ ### Failure behavior
237
+
238
+ - Corrupt generated content: fail before atomic write of that artifact set.
239
+ - Incompatible adapter: skip/block only that adapter with remediation; do not destroy existing deployment.
240
+ - Missing metadata: report diagnostically and preserve unrelated formats.
241
+ - Explicit skew override: print a prominent warning and record the override in command output; never imply compatibility was verified.
242
+
243
+ ## Implementation Steps
244
+
245
+ | Step | Repository / File | Action | Dependencies | Risk |
246
+ |------|-------------------|--------|--------------|------|
247
+ | 1 | `pactkit/tests/` | Add RED tests for CLI policy, operation rendering, prompt integrity, parity, and version gates | None | Low |
248
+ | 2 | `pactkit/src/pactkit/profiles.py` | Replace/extend boolean CLI capability with policy | Step 1 | Medium |
249
+ | 3 | `pactkit/src/pactkit/generators/deployer.py` + prompt templates | Add structured operation variables/tokens and canonical render path | Steps 1-2 | High |
250
+ | 4 | `pactkit/src/pactkit/generators/deploy_base.py` | Add lexical and semantic prompt-integrity validation | Step 3 | Medium |
251
+ | 5 | `pactkit/src/pactkit/generators/deployer.py`, `doctor.py`, `cli.py` | Enforce adapter compatibility before dispatch and report metadata divergence | Step 1 | Medium |
252
+ | 6 | `../pactkit-codex/src/pactkit_codex/deployer.py` | Consume shared operation contract; remove prefix CLI rewriting | Steps 2-4 | High |
253
+ | 7 | `../pactkit-codex/tests/` | Add exact corruption regressions, normalized parity, and isolated deployment tests | Step 6 | Medium |
254
+ | 7b | `../pactkit-copilot/src/pactkit_copilot/deployer.py` | Consume shared operation contract; remove local CLI fallback `content.replace()` table (deployer.py:640-) | Steps 2-4 | Medium |
255
+ | 7c | `../pactkit-copilot/tests/` | Add token-consumption and no-stranded-argument regression tests | Step 7b | Medium |
256
+ | 8 | All three repositories (core, codex, copilot) | Run targeted tests, full suites, lint, package-build checks, and temporary-home migration verification | Steps 1-7c | Medium |
257
+ | 9 | Release operations | Release matching Core/adapter versions, reinstall, redeploy, and run doctor/scan smoke test | Step 8 | Medium |
258
+
259
+ ## Security Scope
260
+
261
+ | Check | Applicable | Reason |
262
+ |-------|------------|--------|
263
+ | SEC-1 | Yes | Source, generated instructions, and package compatibility logic change; no credentials may be printed or overwritten |
264
+ | SEC-2 | Yes | Adapter names, versions, paths, and generated prompt content cross validation boundaries and require bounded parsing |
265
+ | SEC-3 | No | No database access |
266
+ | SEC-4 | No | No browser or frontend rendering |
267
+ | SEC-5 | No | No authentication/session behavior |
268
+ | SEC-6 | No | No network API or rate limiting |
269
+ | SEC-7 | Yes | Missing/corrupt package metadata and partial adapter failure must degrade safely without overwriting good deployments |
270
+ | SEC-8 | Yes | Package dependency bounds and cross-package version compatibility are central to this Story |
271
+
272
+ ## Out of Scope
273
+
274
+ - Terra/GPT model prompt tuning or provider routing changes.
275
+ - Codex Runtime `unsupported custom tool call` defects.
276
+ - A durable Act state machine, per-phase state file, or automatic cross-turn resume; create a follow-up Story after deployment parity is restored.
277
+ - Changing the `$project-act` user-facing invocation syntax.
278
+ - Folding external adapter repositories into PactKit Core.
279
+ - Running migration against the real user home during automated tests.
280
+
281
+ ## Rollback
282
+
283
+ If the aligned release causes deployment regressions:
284
+
285
+ 1. stop before overwriting existing managed artifacts when integrity validation fails;
286
+ 2. reinstall the previous matching Core/adapter pair, never a mixed pair;
287
+ 3. redeploy managed files while preserving `config.toml`;
288
+ 4. verify the previous `.pactkit-deployed.json` hashes and `pactkit doctor` output;
289
+ 5. retain the new corruption fixtures so the faulty transformation cannot be reintroduced silently.