pactkit 2.10.6__tar.gz → 2.12.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 (574) hide show
  1. {pactkit-2.10.6 → pactkit-2.12.0}/.github/workflows/pactkit.yml +1 -1
  2. {pactkit-2.10.6 → pactkit-2.12.0}/.opencode/pactkit.yaml +13 -7
  3. {pactkit-2.10.6 → pactkit-2.12.0}/CHANGELOG.md +20 -0
  4. {pactkit-2.10.6 → pactkit-2.12.0}/PKG-INFO +1 -2
  5. {pactkit-2.10.6 → pactkit-2.12.0}/README.md +0 -1
  6. {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/archive/lessons_archive_202603.md +4 -0
  7. {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/lessons.md +4 -3
  8. {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/rules.md +1 -1
  9. pactkit-2.12.0/docs/e2e/journey.md +243 -0
  10. {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/archive/archive_202604.md +46 -0
  11. pactkit-2.12.0/docs/product/context.md +31 -0
  12. pactkit-2.12.0/docs/product/sprint_board.md +39 -0
  13. pactkit-2.12.0/docs/specs/BUG-slim-107.md +12 -0
  14. pactkit-2.12.0/docs/specs/HOTFIX-slim-107.md +19 -0
  15. pactkit-2.12.0/docs/specs/STORY-slim-105.md +149 -0
  16. pactkit-2.12.0/docs/specs/STORY-slim-106.md +171 -0
  17. pactkit-2.12.0/docs/specs/STORY-slim-107.md +134 -0
  18. pactkit-2.12.0/docs/specs/STORY-slim-108.md +97 -0
  19. pactkit-2.12.0/docs/specs/STORY-slim-109.md +106 -0
  20. pactkit-2.12.0/docs/specs/STORY-slim-110.md +96 -0
  21. pactkit-2.12.0/docs/specs/STORY-slim-111.md +100 -0
  22. pactkit-2.12.0/docs/specs/STORY-slim-112.md +255 -0
  23. {pactkit-2.10.6 → pactkit-2.12.0}/pyproject.toml +1 -1
  24. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/__init__.py +1 -1
  25. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/cli.py +14 -1
  26. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/config.py +11 -45
  27. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/deployer.py +59 -116
  28. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/lazy_visualize.py +1 -1
  29. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/__init__.py +3 -0
  30. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/agents.py +2 -2
  31. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/commands.py +66 -5
  32. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/rules.py +188 -36
  33. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/skills.py +18 -9
  34. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/workflows.py +16 -1
  35. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/schemas.py +3 -0
  36. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/board.py +26 -41
  37. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/spec_linter.py +12 -0
  38. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/visualize.py +26 -8
  39. {pactkit-2.10.6 → pactkit-2.12.0}/tests/e2e/cli/test_cli_e2e.py +42 -5
  40. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug004_dead_set.py +8 -5
  41. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug009_project_config_backfill.py +0 -36
  42. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug010_rewrite_yaml.py +0 -50
  43. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_022.py +0 -15
  44. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_023.py +0 -1
  45. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_config.py +2 -2
  46. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_config_auto_merge.py +3 -2
  47. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_constitution_sharpening.py +30 -15
  48. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_deployer_plugin.py +11 -3
  49. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_design_command.py +105 -0
  50. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_hotfix_command.py +0 -12
  51. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_mcp_integration.py +18 -10
  52. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_modular_constitution.py +7 -11
  53. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompt_structural_invariants.py +2 -2
  54. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_release.py +0 -34
  55. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_review_command.py +0 -12
  56. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_rules_enrichment.py +19 -8
  57. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_selective_deploy.py +29 -15
  58. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_solution_design_rule.py +16 -10
  59. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story028_rule_scoping.py +23 -10
  60. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story033_config_backfill.py +2 -34
  61. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story034_plan_config_refresh.py +0 -1
  62. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story049_community_standards.py +0 -4
  63. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story063_prompt_slimming.py +5 -1
  64. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story072_developer_prefix.py +0 -23
  65. pactkit-2.12.0/tests/unit/test_story106_lateral_scan.py +239 -0
  66. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim009_lazy_rules.py +41 -19
  67. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim011_command_rules.py +40 -20
  68. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim021.py +11 -7
  69. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim023.py +5 -2
  70. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim026.py +1 -1
  71. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim028.py +19 -11
  72. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim051.py +0 -26
  73. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim052.py +0 -20
  74. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim083.py +4 -2
  75. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim098_pdca_nudge.py +22 -17
  76. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim102_version_marker.py +2 -1
  77. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim104_should_semantics.py +4 -3
  78. pactkit-2.12.0/tests/unit/test_story_slim107.py +145 -0
  79. pactkit-2.12.0/tests/unit/test_story_slim109_journey_spec.py +112 -0
  80. pactkit-2.12.0/tests/unit/test_story_slim111_playwright_assertion.py +144 -0
  81. pactkit-2.12.0/tests/unit/test_story_slim112_rules_split.py +394 -0
  82. pactkit-2.10.6/docs/product/context.md +0 -28
  83. pactkit-2.10.6/docs/product/sprint_board.md +0 -8
  84. pactkit-2.10.6/tests/unit/test_story027_hooks.py +0 -112
  85. {pactkit-2.10.6 → pactkit-2.12.0}/.github/workflows/publish.yml +0 -0
  86. {pactkit-2.10.6 → pactkit-2.12.0}/.gitignore +0 -0
  87. {pactkit-2.10.6 → pactkit-2.12.0}/AGENTS.md +0 -0
  88. {pactkit-2.10.6 → pactkit-2.12.0}/CODE_OF_CONDUCT.md +0 -0
  89. {pactkit-2.10.6 → pactkit-2.12.0}/CONTRIBUTING.md +0 -0
  90. {pactkit-2.10.6 → pactkit-2.12.0}/LICENSE +0 -0
  91. {pactkit-2.10.6 → pactkit-2.12.0}/SECURITY.md +0 -0
  92. {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/archive/lessons_archive_202602.md +0 -0
  93. {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/harness_audit.json +0 -0
  94. {pactkit-2.10.6 → pactkit-2.12.0}/docs/architecture/governance/philosophy.md +0 -0
  95. {pactkit-2.10.6 → pactkit-2.12.0}/docs/assets/logo.png +0 -0
  96. {pactkit-2.10.6 → pactkit-2.12.0}/docs/guides/codex-integration-preresearch.md +0 -0
  97. {pactkit-2.10.6 → pactkit-2.12.0}/docs/guides/tool-integration-checklist.md +0 -0
  98. {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/archive/archive_202602.md +0 -0
  99. {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/archive/archive_202603.md +0 -0
  100. {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/friction-log.md +0 -0
  101. {pactkit-2.10.6 → pactkit-2.12.0}/docs/product/prd.md +0 -0
  102. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-001.md +0 -0
  103. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-002.md +0 -0
  104. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-003.md +0 -0
  105. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-004.md +0 -0
  106. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-005.md +0 -0
  107. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-006.md +0 -0
  108. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-007.md +0 -0
  109. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-008.md +0 -0
  110. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-009.md +0 -0
  111. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-010.md +0 -0
  112. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-011.md +0 -0
  113. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-012.md +0 -0
  114. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-013.md +0 -0
  115. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-014.md +0 -0
  116. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-015.md +0 -0
  117. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-016.md +0 -0
  118. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-017.md +0 -0
  119. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-018.md +0 -0
  120. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-019.md +0 -0
  121. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-020.md +0 -0
  122. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-021.md +0 -0
  123. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-022.md +0 -0
  124. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-023.md +0 -0
  125. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-024.md +0 -0
  126. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-025.md +0 -0
  127. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-026.md +0 -0
  128. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-027.md +0 -0
  129. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-028.md +0 -0
  130. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-029.md +0 -0
  131. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-030.md +0 -0
  132. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-031.md +0 -0
  133. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-032.md +0 -0
  134. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-033.md +0 -0
  135. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-034.md +0 -0
  136. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-035.md +0 -0
  137. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-001.md +0 -0
  138. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-002.md +0 -0
  139. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-003.md +0 -0
  140. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-004.md +0 -0
  141. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-005.md +0 -0
  142. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-006.md +0 -0
  143. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/BUG-slim-089.md +0 -0
  144. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-023.md +0 -0
  145. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-049.md +0 -0
  146. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-050.md +0 -0
  147. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-051.md +0 -0
  148. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-052.md +0 -0
  149. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-061.md +0 -0
  150. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-062.md +0 -0
  151. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-067.md +0 -0
  152. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-069.md +0 -0
  153. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-070.md +0 -0
  154. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-085.md +0 -0
  155. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-087.md +0 -0
  156. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-096.md +0 -0
  157. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/HOTFIX-slim-099.md +0 -0
  158. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-001.md +0 -0
  159. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-002.md +0 -0
  160. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-003.md +0 -0
  161. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-004.md +0 -0
  162. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-005.md +0 -0
  163. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-006.md +0 -0
  164. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-007.md +0 -0
  165. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-008.md +0 -0
  166. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-009.md +0 -0
  167. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-010.md +0 -0
  168. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-011.md +0 -0
  169. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-012.md +0 -0
  170. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-013.md +0 -0
  171. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-014.md +0 -0
  172. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-015.md +0 -0
  173. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-016.md +0 -0
  174. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-017.md +0 -0
  175. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-018.md +0 -0
  176. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-019.md +0 -0
  177. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-020.md +0 -0
  178. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-021.md +0 -0
  179. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-022.md +0 -0
  180. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-023.md +0 -0
  181. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-024.md +0 -0
  182. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-025.md +0 -0
  183. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-026.md +0 -0
  184. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-027.md +0 -0
  185. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-028.md +0 -0
  186. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-029.md +0 -0
  187. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-030.md +0 -0
  188. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-031.md +0 -0
  189. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-032.md +0 -0
  190. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-033.md +0 -0
  191. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-034.md +0 -0
  192. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-035.md +0 -0
  193. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-036.md +0 -0
  194. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-037.md +0 -0
  195. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-038.md +0 -0
  196. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-039.md +0 -0
  197. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-040.md +0 -0
  198. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-041.md +0 -0
  199. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-042.md +0 -0
  200. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-043.md +0 -0
  201. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-044.md +0 -0
  202. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-045.md +0 -0
  203. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-046.md +0 -0
  204. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-047.md +0 -0
  205. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-048.md +0 -0
  206. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-049.md +0 -0
  207. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-050.md +0 -0
  208. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-051.md +0 -0
  209. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-052.md +0 -0
  210. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-053.md +0 -0
  211. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-054.md +0 -0
  212. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-055.md +0 -0
  213. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-056.md +0 -0
  214. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-057.md +0 -0
  215. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-058.md +0 -0
  216. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-059.md +0 -0
  217. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-060.md +0 -0
  218. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-061.md +0 -0
  219. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-062.md +0 -0
  220. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-063.md +0 -0
  221. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-064.md +0 -0
  222. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-065.md +0 -0
  223. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-069.md +0 -0
  224. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-070.md +0 -0
  225. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-071.md +0 -0
  226. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-072.md +0 -0
  227. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-073.md +0 -0
  228. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-001.md +0 -0
  229. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-005.md +0 -0
  230. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-006.md +0 -0
  231. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-007.md +0 -0
  232. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-009.md +0 -0
  233. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-010.md +0 -0
  234. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-011.md +0 -0
  235. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-012.md +0 -0
  236. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-013.md +0 -0
  237. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-014.md +0 -0
  238. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-015.md +0 -0
  239. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-016.md +0 -0
  240. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-017.md +0 -0
  241. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-018.md +0 -0
  242. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-019.md +0 -0
  243. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-020.md +0 -0
  244. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-021.md +0 -0
  245. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-022.md +0 -0
  246. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-023.md +0 -0
  247. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-024.md +0 -0
  248. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-028.md +0 -0
  249. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-029.md +0 -0
  250. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-030.md +0 -0
  251. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-031.md +0 -0
  252. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-032.md +0 -0
  253. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-033.md +0 -0
  254. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-034.md +0 -0
  255. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-035.md +0 -0
  256. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-036.md +0 -0
  257. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-037.md +0 -0
  258. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-038.md +0 -0
  259. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-039.md +0 -0
  260. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-040.md +0 -0
  261. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-041.md +0 -0
  262. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-042.md +0 -0
  263. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-043.md +0 -0
  264. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-044.md +0 -0
  265. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-045.md +0 -0
  266. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-046.md +0 -0
  267. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-047.md +0 -0
  268. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-048.md +0 -0
  269. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-049.md +0 -0
  270. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-050.md +0 -0
  271. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-051.md +0 -0
  272. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-052.md +0 -0
  273. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-053.md +0 -0
  274. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-054.md +0 -0
  275. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-055.md +0 -0
  276. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-056.md +0 -0
  277. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-057.md +0 -0
  278. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-058.md +0 -0
  279. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-059.md +0 -0
  280. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-060.md +0 -0
  281. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-063.md +0 -0
  282. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-066.md +0 -0
  283. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-067.md +0 -0
  284. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-068.md +0 -0
  285. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-069.md +0 -0
  286. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-070.md +0 -0
  287. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-071.md +0 -0
  288. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-072.md +0 -0
  289. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-073.md +0 -0
  290. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-074.md +0 -0
  291. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-075.md +0 -0
  292. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-076.md +0 -0
  293. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-077.md +0 -0
  294. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-078.md +0 -0
  295. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-079.md +0 -0
  296. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-080.md +0 -0
  297. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-081.md +0 -0
  298. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-082.md +0 -0
  299. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-083.md +0 -0
  300. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-084.md +0 -0
  301. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-086.md +0 -0
  302. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-088.md +0 -0
  303. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-089.md +0 -0
  304. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-090.md +0 -0
  305. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-091.md +0 -0
  306. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-092.md +0 -0
  307. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-093.md +0 -0
  308. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-094.md +0 -0
  309. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-095.md +0 -0
  310. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-097.md +0 -0
  311. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-098.md +0 -0
  312. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-099.md +0 -0
  313. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-100.md +0 -0
  314. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-101.md +0 -0
  315. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-102.md +0 -0
  316. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-103.md +0 -0
  317. {pactkit-2.10.6 → pactkit-2.12.0}/docs/specs/STORY-slim-104.md +0 -0
  318. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/BUG-001_case.md +0 -0
  319. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/BUG-002_case.md +0 -0
  320. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-028_case.md +0 -0
  321. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-029_case.md +0 -0
  322. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-031_case.md +0 -0
  323. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-032_case.md +0 -0
  324. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-033_case.md +0 -0
  325. {pactkit-2.10.6 → pactkit-2.12.0}/docs/test_cases/STORY-slim-034_case.md +0 -0
  326. {pactkit-2.10.6 → pactkit-2.12.0}/opencode.json +0 -0
  327. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/__main__.py +0 -0
  328. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/audit.py +0 -0
  329. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/backfill.py +0 -0
  330. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/cleaners.py +0 -0
  331. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/context_gen.py +0 -0
  332. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/coverage_gate.py +0 -0
  333. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/doctor.py +0 -0
  334. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/garden.py +0 -0
  335. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/__init__.py +0 -0
  336. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/adapter.py +0 -0
  337. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/generators/deploy_base.py +0 -0
  338. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/guards.py +0 -0
  339. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/id_generator.py +0 -0
  340. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/invariants.py +0 -0
  341. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/issue_sync.py +0 -0
  342. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/lessons.py +0 -0
  343. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/lint_runner.py +0 -0
  344. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/observe.py +0 -0
  345. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/profiles.py +0 -0
  346. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/prompts/references.py +0 -0
  347. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/regression.py +0 -0
  348. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/scripts.py +0 -0
  349. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/sec_scope.py +0 -0
  350. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/__init__.py +0 -0
  351. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/__init__.py +0 -0
  352. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/go_analyzer.py +0 -0
  353. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/java_analyzer.py +0 -0
  354. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/python_analyzer.py +0 -0
  355. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/analyzers/ts_analyzer.py +0 -0
  356. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/report.py +0 -0
  357. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/skills/scaffold.py +0 -0
  358. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/spec_status.py +0 -0
  359. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/test_mapper.py +0 -0
  360. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/utils.py +0 -0
  361. {pactkit-2.10.6 → pactkit-2.12.0}/src/pactkit/validators.py +0 -0
  362. {pactkit-2.10.6 → pactkit-2.12.0}/tests/conftest.py +0 -0
  363. {pactkit-2.10.6 → pactkit-2.12.0}/tests/e2e/__init__.py +0 -0
  364. {pactkit-2.10.6 → pactkit-2.12.0}/tests/e2e/cli/__init__.py +0 -0
  365. {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/agents_dir/researcher.yaml +0 -0
  366. {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/agents_dir/writer.yaml +0 -0
  367. {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/langgraph_app.py +0 -0
  368. {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/agent_parser/mcp_settings.json +0 -0
  369. {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/api_call_parser/axios_style.tsx +0 -0
  370. {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/api_call_parser/dynamic.tsx +0 -0
  371. {pactkit-2.10.6 → pactkit-2.12.0}/tests/fixtures/api_call_parser/page.tsx +0 -0
  372. {pactkit-2.10.6 → pactkit-2.12.0}/tests/integration/__init__.py +0 -0
  373. {pactkit-2.10.6 → pactkit-2.12.0}/tests/integration/test_deploy_classic.py +0 -0
  374. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_agent_features.py +0 -0
  375. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_agent_frontmatter.py +0 -0
  376. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_agents_enrichment.py +0 -0
  377. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_audit.py +0 -0
  378. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_blast_radius.py +0 -0
  379. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_board_bug027.py +0 -0
  380. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_board_sections.py +0 -0
  381. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug001_skill_path.py +0 -0
  382. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug002_plugin_paths.py +0 -0
  383. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug003_multi_import.py +0 -0
  384. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug005_archive_taskless.py +0 -0
  385. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug006_scan_excludes.py +0 -0
  386. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug007_stale_trace_refs.py +0 -0
  387. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug008_stale_command_refs.py +0 -0
  388. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug011_stale_refs.py +0 -0
  389. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug012_call_graph_filter.py +0 -0
  390. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug013_config_single_source.py +0 -0
  391. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug014_version_hygiene.py +0 -0
  392. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug017_project_init_playbook.py +0 -0
  393. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug018_issue_tracker_verification.py +0 -0
  394. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug019_venv_deployment.py +0 -0
  395. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug020_claude_md_backup.py +0 -0
  396. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug025_release_delegation.py +0 -0
  397. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug026_version_sync.py +0 -0
  398. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug028_ghost_refs.py +0 -0
  399. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug029_stack_detection_fallback.py +0 -0
  400. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug030_spec_lint_cli.py +0 -0
  401. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug031_docstring_accuracy.py +0 -0
  402. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug034_plan_metadata_template.py +0 -0
  403. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_021.py +0 -0
  404. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_024.py +0 -0
  405. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim001_env_detection.py +0 -0
  406. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim002_instruction_collision.py +0 -0
  407. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim003.py +0 -0
  408. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim004.py +0 -0
  409. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim005.py +0 -0
  410. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim006.py +0 -0
  411. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_bug_slim089_global_claude_md.py +0 -0
  412. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_check_command.py +0 -0
  413. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_check_extensions_072_073.py +0 -0
  414. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_check_playbook_072_073.py +0 -0
  415. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_command_frontmatter.py +0 -0
  416. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_command_visualize_modes.py +0 -0
  417. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_complexity.py +0 -0
  418. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_context_gen.py +0 -0
  419. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_create_skill.py +0 -0
  420. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_cross_flow_matrix.py +0 -0
  421. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_deploy_base.py +0 -0
  422. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_deployer_cleanup.py +0 -0
  423. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_done_gates.py +0 -0
  424. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_draw_prompt.py +0 -0
  425. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_draw_references.py +0 -0
  426. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_drawio_mcp.py +0 -0
  427. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_garden.py +0 -0
  428. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_home_path_fix.py +0 -0
  429. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_init_guard.py +0 -0
  430. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_init_playbook_074.py +0 -0
  431. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_lang_profiles.py +0 -0
  432. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_layer_violations.py +0 -0
  433. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_lessons_rotation_075.py +0 -0
  434. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_list_stories.py +0 -0
  435. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_model_config.py +0 -0
  436. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_monorepo_detect.py +0 -0
  437. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_multi_prefix.py +0 -0
  438. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_observe.py +0 -0
  439. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_pdca_slim.py +0 -0
  440. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_profiles.py +0 -0
  441. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_project_visibility.py +0 -0
  442. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompt_cli_refs.py +0 -0
  443. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompt_quality_075.py +0 -0
  444. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_prompts_package.py +0 -0
  445. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_release_field.py +0 -0
  446. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_release_v110.py +0 -0
  447. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_render_prompt.py +0 -0
  448. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_report_parser.py +0 -0
  449. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_report_unified.py +0 -0
  450. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_scaffold.py +0 -0
  451. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_scaffold_developer_prefix.py +0 -0
  452. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_schemas.py +0 -0
  453. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_script_extraction.py +0 -0
  454. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_session_context.py +0 -0
  455. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_skill_structure.py +0 -0
  456. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_skills_enrichment.py +0 -0
  457. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_slim_deps_088.py +0 -0
  458. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_smart_regression.py +0 -0
  459. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_sprint_command.py +0 -0
  460. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_stack_references.py +0 -0
  461. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_status_command.py +0 -0
  462. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_statusline.py +0 -0
  463. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story014_release.py +0 -0
  464. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story015_ci_lint_gate.py +0 -0
  465. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story016_claude_md.py +0 -0
  466. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story017_init_claude_md.py +0 -0
  467. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story018_arch_staleness.py +0 -0
  468. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story019_bailout.py +0 -0
  469. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story020_horizon.py +0 -0
  470. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story021_rfc.py +0 -0
  471. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story022_decision_tree.py +0 -0
  472. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story023_test_quality.py +0 -0
  473. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story024_native_agent.py +0 -0
  474. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story025_ci_pipeline.py +0 -0
  475. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story026_issue_tracker.py +0 -0
  476. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story029_doctor.py +0 -0
  477. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story030_lint.py +0 -0
  478. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story031_git_init_guard.py +0 -0
  479. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story032_greenfield_redirect.py +0 -0
  480. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story035_readme_docs.py +0 -0
  481. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story037_regression_fix.py +0 -0
  482. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story038_call_graph_update.py +0 -0
  483. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story039_venv_config.py +0 -0
  484. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story040_layered_claude_md.py +0 -0
  485. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story042_spec_linter.py +0 -0
  486. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story043_active_clarify.py +0 -0
  487. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story044_consistency_check.py +0 -0
  488. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story045_auto_pr.py +0 -0
  489. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story046_agent_adapter.py +0 -0
  490. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story047_enterprise_flags.py +0 -0
  491. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story048_worktree_isolation.py +0 -0
  492. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story050_doc_only_shortcut.py +0 -0
  493. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story051_workflow_streamlining.py +0 -0
  494. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story052_conditional_github_release.py +0 -0
  495. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story053_impact_regression.py +0 -0
  496. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story055_commands.py +0 -0
  497. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story055_config.py +0 -0
  498. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story055_spec_linter.py +0 -0
  499. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story056_commands.py +0 -0
  500. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story056_config.py +0 -0
  501. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story057_implicit_cleanup.py +0 -0
  502. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story058_opencode_extraction.py +0 -0
  503. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story058_routing_fix.py +0 -0
  504. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story059_codex_removal.py +0 -0
  505. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story060_init_hang.py +0 -0
  506. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story061_remove_thinking.py +0 -0
  507. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story062_mcp_recommendations.py +0 -0
  508. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story064_venv_local_md.py +0 -0
  509. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story065_sprint_model.py +0 -0
  510. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim010_dry_refactor.py +0 -0
  511. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim012_ci.py +0 -0
  512. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_clean.py +0 -0
  513. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_context.py +0 -0
  514. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_guard.py +0 -0
  515. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_lazy_viz.py +0 -0
  516. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_next_id.py +0 -0
  517. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_regression.py +0 -0
  518. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_sec_scope.py +0 -0
  519. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim014_validators.py +0 -0
  520. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim015_doctor.py +0 -0
  521. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim016_testmap_lint.py +0 -0
  522. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim017.py +0 -0
  523. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim018.py +0 -0
  524. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim019_plan_subphases.py +0 -0
  525. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim020_explore_stall_fix.py +0 -0
  526. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim022.py +0 -0
  527. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim024.py +0 -0
  528. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim025.py +0 -0
  529. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim027.py +0 -0
  530. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim029.py +0 -0
  531. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim030.py +0 -0
  532. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim031.py +0 -0
  533. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim032.py +0 -0
  534. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim033.py +0 -0
  535. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim034.py +0 -0
  536. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim035.py +0 -0
  537. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim036.py +0 -0
  538. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim037.py +0 -0
  539. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim038.py +0 -0
  540. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim039.py +0 -0
  541. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim040.py +0 -0
  542. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim041.py +0 -0
  543. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim042.py +0 -0
  544. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim043.py +0 -0
  545. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim044.py +0 -0
  546. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim045.py +0 -0
  547. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim046.py +0 -0
  548. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim047.py +0 -0
  549. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim048.py +0 -0
  550. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim049.py +0 -0
  551. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim053.py +0 -0
  552. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim054.py +0 -0
  553. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim055.py +0 -0
  554. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim056.py +0 -0
  555. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim060_codex_profile.py +0 -0
  556. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim063.py +0 -0
  557. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim065.py +0 -0
  558. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim076_multistack.py +0 -0
  559. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim077_monorepo_stack.py +0 -0
  560. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim078.py +0 -0
  561. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim079.py +0 -0
  562. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim080.py +0 -0
  563. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim081.py +0 -0
  564. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim082.py +0 -0
  565. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim084.py +0 -0
  566. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim095.py +0 -0
  567. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_story_slim099_act_context_ref.py +0 -0
  568. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_tools.py +0 -0
  569. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_topology_parsers_066.py +0 -0
  570. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_update_task.py +0 -0
  571. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_call_nested.py +0 -0
  572. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_chain_fix.py +0 -0
  573. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_modes.py +0 -0
  574. {pactkit-2.10.6 → pactkit-2.12.0}/tests/unit/test_visualize_multilang_chain.py +0 -0
@@ -20,7 +20,7 @@ jobs:
20
20
  - name: Install dependencies
21
21
  run: |
22
22
  python -m pip install --upgrade pip
23
- pip install -e ".[visualize]"
23
+ pip install -e .
24
24
  pip install pytest ruff
25
25
  pactkit init
26
26
 
@@ -2,7 +2,6 @@
2
2
  # Edit this file to customize which components are deployed.
3
3
  # Remove items from a list to disable them. Default: all enabled.
4
4
 
5
- version: "2.10.4"
6
5
  stack: python
7
6
  root: .
8
7
  developer: "slim"
@@ -72,6 +71,15 @@ rules:
72
71
  - 08-architecture-principles
73
72
  - 09-sectional-write
74
73
  - 11-pdca-nudge
74
+ - 12-solution-design
75
+ - 05-principles
76
+ - 01-workflow-conventions
77
+ - 02-mcp-integration
78
+ - 03-shared-protocols
79
+ - 04-architecture-principles
80
+ - 05-sectional-write
81
+ - 06-solution-design
82
+ - pactkit
75
83
 
76
84
  # CI/CD — set provider to github or gitlab to generate pipeline config
77
85
  ci:
@@ -85,12 +93,6 @@ ci:
85
93
  issue_tracker:
86
94
  provider: github
87
95
 
88
- # Hooks — safe, report-only hook templates (command-type only)
89
- hooks:
90
- post_test_coverage: false
91
- pre_commit_lint: false
92
- pre_push_check: false
93
-
94
96
  # Lint — configure lint behavior in /project-done
95
97
  lint_blocking: false
96
98
  auto_fix: false
@@ -163,3 +165,7 @@ e2e:
163
165
  env_file: .env.test
164
166
  test_dir: tests/e2e
165
167
  type: none
168
+ hooks:
169
+ post_test_coverage: false
170
+ pre_commit_lint: false
171
+ pre_push_check: false
@@ -4,6 +4,26 @@ 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.12.0] - 2026-05-06
8
+
9
+ ### Changed
10
+ - **Rules architecture refactor** (STORY-slim-112) — Merged 6 global core rules into single `pactkit.md`; on-demand rules renumbered 01-06 and moved to `~/.claude/skills/_rules/`. Reduces context window usage by ~60% per conversation.
11
+ - **Auto-deploy on version mismatch** — After `pipx upgrade pactkit`, the next CLI command auto-syncs deployed files without requiring explicit `pactkit init`.
12
+
13
+ ### Fixed
14
+ - **Hardcoded paths in deployer** — `_build_command_rules_header()` now uses `FormatProfile.rules_dir` / `skills_dir` instead of hardcoded `~/.claude/` paths.
15
+ - **Stale filename references** — Updated cross-references in visualize.py, commands.py, lazy_visualize.py, and test files to match new rule filenames.
16
+
17
+ ## [2.11.0] - 2026-04-25
18
+
19
+ ### Added
20
+ - **Lateral Scan** (STORY-slim-106) — Plan Phase 1 now scans for duplicate patterns before writing Specs. If overlap > 30% with existing implementations, Spec must include `R0: Extract shared abstraction` or declare tech debt accepted. Removed dead hooks code from rules.
21
+ - **DEFERRED comment mechanism** (STORY-slim-105) — When skipping a SHOULD requirement, code must include `# DEFERRED(SHOULD): R{N} — reason` comment. Coverage table output added to Check phase for tracking deferred items.
22
+
23
+ ### Fixed
24
+ - **Residual pactkit.yaml version operations** (HOTFIX-slim-107) — Removed `update_version()` function and CLI subcommand from board.py, plus all stale references in prompts, agents, and skills docs. Version is now exclusively managed in pyproject.toml + __init__.py with deploy marker at ~/.claude/.pactkit-version.
25
+ - **CI tree-sitter deps** — Install tree-sitter optional dependencies in CI workflow to prevent import failures.
26
+
7
27
  ## [2.10.6] - 2026-04-22
8
28
 
9
29
  ### Fixed
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: pactkit
3
- Version: 2.10.6
3
+ Version: 2.12.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
@@ -369,7 +369,6 @@ docs/
369
369
  | Field | Type | Default | Description |
370
370
  |-------|------|---------|-------------|
371
371
  | `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
372
- | `version` | string | current | PactKit version that generated the config |
373
372
  | `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
374
373
  | `agents` | list | all 9 | Agent definitions to deploy |
375
374
  | `commands` | list | all 11 | Command playbooks to deploy |
@@ -327,7 +327,6 @@ docs/
327
327
  | Field | Type | Default | Description |
328
328
  |-------|------|---------|-------------|
329
329
  | `stack` | string | auto-detected | Project stack (`python`, `node`, `go`, `java`) |
330
- | `version` | string | current | PactKit version that generated the config |
331
330
  | `developer` | string | `""` | Developer prefix for Story IDs (multi-developer collaboration) |
332
331
  | `agents` | list | all 9 | Agent definitions to deploy |
333
332
  | `commands` | list | all 11 | Command playbooks to deploy |
@@ -50,3 +50,7 @@
50
50
  | 2026-03-24 | Worktree isolation diverges from working-tree: verify visualize.py _scan_files() signature is preserved across stories to avoid breaking callers | visualize.py:_scan_files |
51
51
  | 2026-03-24 | Extracting _detect_stack() from _detect_file_ext() enables both file discovery and test mapping to share stack detection — DRY refactoring | visualize.py:_detect_stack |
52
52
  | 2026-03-24 | Standalone skill scripts using exec() require all imports in _SHARED_HEADER; new stdlib imports (dataclass) must be added to skills/__init__.py _SHARED_HEADER, not just the standalone header section | skills/__init__.py:_SHARED_HEADER |
53
+ | 2026-03-24 | detect_topology() must delegate to _TOPOLOGY_PARSERS parser.detect() first, not _TOPOLOGY_MARKERS alone — parsers and markers can diverge silently causing empty graphs | visualize.py:detect_topology |
54
+ | 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
55
+ | 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
56
+ | 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
@@ -2,9 +2,6 @@
2
2
 
3
3
  | Date | Lesson | Context |
4
4
  |------|--------|---------|
5
- | 2026-03-24 | _scan_hooks() only accepts files with 'use' prefix in hook dirs (src/hooks/, composables/) to prevent utility files from becoming hook nodes | visualize.py:_scan_hooks |
6
- | 2026-03-24 | regression_workflow_impact hook/store matching uses node.id substring of changed file path, not reverse — e.g. 'useAuth' in 'src/hooks/useAuth.ts' | visualize.py:regression_workflow_impact |
7
- | 2026-03-25 | export_focus_graphs() in visualize.py uses forward_reach() (not reverse_reach()) because entry points (command/service/page) are graph roots that invoke downward — forward BFS shows their dependency tree | src/pactkit/skills/visualize.py:export_focus_graphs |
8
5
  | 2026-03-26 | board.py update_task: added 3-tier fuzzy fallback (single-task auto-mark, substring match, numeric index) to handle real-world callers that don't know exact task names on the board | src/pactkit/skills/board.py:update_task |
9
6
  | 2026-03-26 | Position-based block removal (start, end tuples) is safer than str.find() for board operations — prevents substring false matches on similar story IDs | board.py:_parse_story_blocks |
10
7
  | 2026-03-26 | Fixing _parse_story_blocks to return adjusted_end (len match) inherently fixed fix_board offset compensation — root cause fix in board.py:_parse_story_blocks eliminated downstream R2 symptom in board.py:fix_board | board.py:_parse_story_blocks,board.py:fix_board |
@@ -53,3 +50,7 @@
53
50
  | 2026-04-21 | Version tracking in pactkit.yaml caused cross-project desync — moved to ~/.claude/.pactkit-version as single source of truth for deploy state. config.py get_default_config() no longer includes version field. | STORY-slim-102 |
54
51
  | 2026-04-22 | When the same bug pattern recurs 3+ times across specs (BUG-010, BUG-slim-089, STORY-033, STORY-slim-054), promote the fix from spec-level to a standing rule in 08-architecture-principles.md — ad-hoc spec fixes do not prevent recurrence | ~/.claude/rules/08-architecture-principles.md:§9 |
55
52
  | 2026-04-22 | Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act | src/pactkit/prompts/rules.py:51 |
53
+ | 2026-04-23 | Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly | src/pactkit/prompts/rules.py:RULES_MODULES |
54
+ | 2026-04-24 | Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI | commands.py:Plan_Phase_1 |
55
+ | 2026-04-24 | When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior | board.py:update_version |
56
+ | 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 |
@@ -15,7 +15,7 @@
15
15
 
16
16
  ## Invariants
17
17
 
18
- 1. All 3790+ tests must pass before any commit to `main`.
18
+ 1. All 3841+ 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,243 @@
1
+ # User Journey Format Specification
2
+
3
+ > This document defines the canonical format for `docs/e2e/journey.md` in PactKit-managed projects.
4
+ > It is a **format specification template** -- projects copy and fill this structure with their own journeys.
5
+
6
+ ## Purpose
7
+
8
+ A user journey describes an end-to-end flow that spans multiple stories. While individual stories
9
+ have their own acceptance criteria (in `docs/test_cases/`), journeys capture the cross-story
10
+ integration path that a real user follows.
11
+
12
+ **Relationship to other artifacts:**
13
+ - `docs/test_cases/{ID}_case.md` -- single-story acceptance (Gherkin scenarios)
14
+ - `docs/e2e/journey.md` -- cross-story user flows (this document)
15
+ - `tests/e2e/` -- executable E2E test code implementing journey segments
16
+
17
+ ---
18
+
19
+ ## Journey Structure
20
+
21
+ Each journey follows this format:
22
+
23
+ ```markdown
24
+ ## Journey: {Journey Name}
25
+
26
+ > {One-line description of the user goal}
27
+
28
+ ### Pre-conditions (Fixtures)
29
+
30
+ | Fixture | Description | Setup Method |
31
+ |---------|-------------|--------------|
32
+ | {name} | {what it provides} | {seed script / API call / fixture function} |
33
+
34
+ ### Steps
35
+
36
+ #### Step 1: {Step Title} [client]
37
+
38
+ **Action**: {What the user does}
39
+
40
+ **Assertions**:
41
+ - STRUCTURE: {element/component} exists on page
42
+ - STRUCTURE: {data container} is non-empty
43
+ - BEHAVIOR: {interaction} triggers {expected response}
44
+
45
+ #### Step 2: {Step Title} [server]
46
+
47
+ **Action**: {What the system processes}
48
+
49
+ **Assertions**:
50
+ - STRUCTURE: {database record / API response} contains expected fields
51
+ - STRUCTURE: {response payload} is non-empty
52
+ - BEHAVIOR: {side effect} is observable (log entry, event emitted, etc.)
53
+
54
+ #### Step 3: {Step Title} [server+client]
55
+
56
+ **Action**: {Full-stack interaction}
57
+
58
+ **Assertions**:
59
+ - STRUCTURE: {UI element} renders with data from server
60
+ - STRUCTURE: {response} matches expected schema shape
61
+ - BEHAVIOR: {round-trip} completes within timeout
62
+ ```
63
+
64
+ ---
65
+
66
+ ## Execution Layer Annotations
67
+
68
+ Each step MUST be annotated with its execution layer:
69
+
70
+ | Annotation | Meaning | Test Tooling |
71
+ |------------|---------|--------------|
72
+ | `[client]` | Browser/UI interaction only | Playwright, Cypress |
73
+ | `[server]` | Backend/API processing only | pytest + httpx, curl |
74
+ | `[server+client]` | Full-stack round-trip | Playwright + API assertions |
75
+
76
+ ---
77
+
78
+ ## Assertion Types
79
+
80
+ Assertions are classified into two categories with different enforcement rules:
81
+
82
+ ### Structure Assertions (MUST)
83
+
84
+ Structure assertions verify that the expected elements, fields, or components **exist** and are
85
+ **non-empty**. These are deterministic and safe to assert in any context.
86
+
87
+ Examples:
88
+ - "SQL code block element exists on page"
89
+ - "Chart component is rendered"
90
+ - "API response contains `data` field"
91
+ - "Answer container has text content (length > 0)"
92
+
93
+ ### Content Assertions (MUST NOT for AI-generated content)
94
+
95
+ Content assertions verify specific text values, numbers, or exact strings. These are appropriate
96
+ for deterministic outputs but MUST NOT be used for AI-generated content.
97
+
98
+ **When content is deterministic** (e.g., user profile display, static labels):
99
+ - Exact text matching is acceptable
100
+ - Numeric value assertions are acceptable
101
+
102
+ **When content is AI-generated** (e.g., chatbot responses, generated analysis):
103
+ - MUST NOT assert specific text content
104
+ - MUST NOT assert exact numeric values in generated output
105
+ - MUST NOT assert specific word choices or phrasing
106
+
107
+ ---
108
+
109
+ ## AI Content Assertion Strategy
110
+
111
+ > This section provides guidance for projects that include AI-generated content in their user journeys
112
+ > (e.g., chatbots, AI assistants, generated reports, analysis tools).
113
+
114
+ ### What to Assert (MUST)
115
+
116
+ | Category | Example Assertion |
117
+ |----------|------------------|
118
+ | Structure exists | "SQL code block element is present in the response area" |
119
+ | Non-empty | "Response container has text content with length > 0" |
120
+ | Component renders | "Chart component is mounted and visible" |
121
+ | Schema shape | "API response has `answer` field of type string" |
122
+ | Timing | "Response arrives within N seconds" |
123
+ | State transition | "Loading spinner disappears after response" |
124
+
125
+ ### What NOT to Assert (MUST NOT)
126
+
127
+ | Anti-Pattern | Why It Fails |
128
+ |--------------|--------------|
129
+ | `assert response.text == "The answer is 42"` | AI output is non-deterministic |
130
+ | `assert chart.data_points == [1.5, 2.3, 4.1]` | Generated values vary per run |
131
+ | `assert sql_block.contains("SELECT * FROM users")` | AI may generate equivalent but different SQL |
132
+ | `assert summary.word_count == 150` | Length varies with model/prompt |
133
+
134
+ ### Correct Pattern
135
+
136
+ ```python
137
+ # STRUCTURE: verify element exists
138
+ assert page.locator(".sql-code-block").is_visible()
139
+
140
+ # NON-EMPTY: verify content was generated
141
+ sql_content = page.locator(".sql-code-block").text_content()
142
+ assert len(sql_content.strip()) > 0
143
+
144
+ # SCHEMA: verify response shape, not content
145
+ response = api_client.get("/chat/answer")
146
+ assert "answer" in response.json()
147
+ assert isinstance(response.json()["answer"], str)
148
+ assert len(response.json()["answer"]) > 0
149
+
150
+ # BEHAVIOR: verify state transition occurred
151
+ assert page.locator(".loading-spinner").is_hidden()
152
+ assert page.locator(".answer-area").is_visible()
153
+ ```
154
+
155
+ ---
156
+
157
+ ## Pre-condition Fixtures
158
+
159
+ Each journey MUST declare its pre-conditions as named fixtures:
160
+
161
+ ```markdown
162
+ ### Pre-conditions (Fixtures)
163
+
164
+ | Fixture | Description | Setup Method |
165
+ |---------|-------------|--------------|
166
+ | authenticated_user | Logged-in user session | `conftest.py::auth_fixture` |
167
+ | sample_dataset | Pre-loaded test data | `scripts/seed_test_data.py` |
168
+ | clean_state | Empty database with schema | `pytest fixture: db_reset` |
169
+ ```
170
+
171
+ Fixtures are referenced by name in step pre-conditions, enabling:
172
+ - Test isolation (each journey starts from a known state)
173
+ - Parallelization (independent journeys can run concurrently)
174
+ - Debugging (reproduce failures by loading specific fixtures)
175
+
176
+ ---
177
+
178
+ ## Example: Complete Journey
179
+
180
+ ```markdown
181
+ ## Journey: First Question to Answer
182
+
183
+ > New user asks their first question and receives an AI-generated answer.
184
+
185
+ ### Pre-conditions (Fixtures)
186
+
187
+ | Fixture | Description | Setup Method |
188
+ |---------|-------------|--------------|
189
+ | authenticated_user | Logged-in user with valid session | `conftest.py::auth_user` |
190
+ | connected_datasource | At least one data source configured | `seed/datasource.sql` |
191
+
192
+ ### Steps
193
+
194
+ #### Step 1: Navigate to Chat [client]
195
+
196
+ **Action**: User opens the chat interface from dashboard.
197
+
198
+ **Assertions**:
199
+ - STRUCTURE: Chat input field is visible
200
+ - STRUCTURE: Message history area exists (may be empty)
201
+ - BEHAVIOR: Input field accepts text input
202
+
203
+ #### Step 2: Submit Question [server+client]
204
+
205
+ **Action**: User types a question and presses Enter.
206
+
207
+ **Assertions**:
208
+ - STRUCTURE: Loading indicator appears
209
+ - STRUCTURE: User message appears in history
210
+ - BEHAVIOR: API call to `/api/chat` is triggered
211
+
212
+ #### Step 3: Receive Answer [server+client]
213
+
214
+ **Action**: Server processes the question and streams response.
215
+
216
+ **Assertions**:
217
+ - STRUCTURE: Answer area becomes visible
218
+ - STRUCTURE: Answer text content is non-empty
219
+ - STRUCTURE: SQL code block is present (if query was data-related)
220
+ - BEHAVIOR: Loading indicator disappears
221
+ - MUST NOT: Assert specific answer text content (AI-generated)
222
+ - MUST NOT: Assert exact SQL query string (AI-generated)
223
+
224
+ #### Step 4: View Generated Visualization [client]
225
+
226
+ **Action**: User clicks on the chart tab to see generated visualization.
227
+
228
+ **Assertions**:
229
+ - STRUCTURE: Chart component is rendered
230
+ - STRUCTURE: Chart has at least one data series
231
+ - BEHAVIOR: Chart responds to hover interaction
232
+ - MUST NOT: Assert specific chart data values (AI-generated)
233
+ ```
234
+
235
+ ---
236
+
237
+ ## Usage in Check Phase 4
238
+
239
+ When `/project-check` Phase 4 (E2E Execution) runs:
240
+
241
+ 1. If `docs/e2e/journey.md` exists, read it to identify journey segments affected by the current story
242
+ 2. E2E tests SHOULD cover the affected segments (not the full journey)
243
+ 3. Journey definitions inform test scope; `docs/test_cases/` informs acceptance criteria
@@ -241,3 +241,49 @@
241
241
  - [x] Change L3 Semantics text in rules.py
242
242
  - [x] Add SHOULD clarification note
243
243
  - [x] Add test for L3 content
244
+
245
+ ### [STORY-slim-105] SHOULD 覆盖追踪与改动类型声明
246
+ > Spec: docs/specs/STORY-slim-105.md
247
+
248
+ - [x] 更新01-core-protocol.md SHOULD语义
249
+ - [x] 更新05-workflow-conventions.md DEFERRED规范
250
+ - [x] schemas.py新增常量
251
+ - [x] spec_linter.py新增W010
252
+ - [x] project-act.md覆盖表输出
253
+ - [x] 测试用例
254
+
255
+ ### [STORY-slim-106] Plan 阶段横向扫描强化与 hooks 死代码清理
256
+ > Spec: docs/specs/STORY-slim-106.md
257
+
258
+ - [x] R1: Plan playbook Lateral Scan 步骤
259
+ - [x] R2: Solution Design Internal Patterns
260
+ - [x] R3: Architecture Principles 通用化
261
+ - [x] R4: 删除 hooks 死代码
262
+ - [x] R5: spec_linter W006
263
+ - [x] 测试覆盖
264
+
265
+ ### [HOTFIX-slim-107] Remove residual pactkit.yaml version operations
266
+ > Spec: docs/specs/HOTFIX-slim-107.md
267
+
268
+ - [x] Remove update_version function
269
+ - [x] Update CLI help text
270
+ - [x] Clean prompt references
271
+ - [x] Update agent docs
272
+
273
+ ### [STORY-slim-107] Integrate tech debt prevention patterns into framework rules
274
+ > Spec: docs/specs/STORY-slim-107.md
275
+
276
+ - [x] Expand architecture §1 DRY with dual-write
277
+ - [x] Expand architecture §6 Security (deny-by-default, input validation, timing)
278
+ - [x] Add architecture §10 Code Enforces / LLM≠Calculator
279
+ - [x] Add architecture §11 Concurrency & Async Safety
280
+ - [x] Add architecture §12 Cache Lifecycle
281
+ - [x] Add architecture §13 Dead Code Hygiene
282
+ - [x] Add String→Enum to solution module
283
+ - [x] Run test suite
284
+
285
+ ### [BUG-slim-107] Fix scan_excludes replacing defaults and hidden root module
286
+ > Spec: docs/specs/BUG-slim-107.md
287
+
288
+ - [x] Merge custom excludes with defaults
289
+ - [x] Show root module in available list
@@ -0,0 +1,31 @@
1
+ # Project Context (Auto-generated)
2
+ > Last updated: 2026-05-06T14:08:28+08:00 by pactkit context
3
+
4
+ ## Sprint Status
5
+ Backlog: 1 | In Progress: 0 | Done: 4 stories
6
+
7
+ ## Current Stories
8
+ None
9
+
10
+ ## Recent Completions
11
+ - STORY-slim-110: project-design 集成 User Journey 生成
12
+ - STORY-slim-109: E2E journey.md 规范定义与 File Atlas 集成
13
+ - STORY-slim-108: pactkit-trace --summary 模式:接口摘要输出
14
+
15
+ ## Active Branches
16
+ + claude/naughty-euclid-e6a787
17
+ develop
18
+ * main
19
+
20
+ ## Key Decisions
21
+ - Signal Strength L3 SHOULD semantics in rules.py:RULES_MODULES['core'] must use RFC 2119 wording — 'warning, non-blocking' caused AI to systematically defer all SHOULD tasks during Act
22
+ - Rule files deploy from src/pactkit/prompts/rules.py via pactkit deploy — never edit ~/.claude/rules/ directly
23
+ - Plan Phase横向扫描(Lateral Scan)比纵向trace更重要——PactSearch的10个技术债中60%源于缺少水平重复检测。修复方向是改Plan playbook引导Architect用已有工具(LSP/visualize/grep)做横向扫描,而非新建CLI
24
+ - When migrating functionality (e.g., version checking from pactkit.yaml to global marker), grep all references across source, prompts, tests, and CLI help text — partial migration leaves ghost behavior
25
+ - 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
26
+
27
+ ## Next Recommended Action
28
+ `/project-plan`
29
+
30
+ ## Agent Continuation
31
+ No active work session.
@@ -0,0 +1,39 @@
1
+ # Sprint Board
2
+
3
+ ## 📋 Backlog
4
+
5
+
6
+ ### [STORY-slim-112] Rules 架构重构:全局原则 vs 按需操作规程
7
+ > Spec: docs/specs/STORY-slim-112.md
8
+
9
+ - [ ] 拆分 RULES_CORE/ONDEMAND + 新建 05-principles
10
+ - [ ] 更新 deployer 双目录部署
11
+ - [ ] 更新所有 skill @import 路径
12
+ - [ ] 更新测试断言
13
+
14
+ ## 🔄 In Progress
15
+
16
+ ## ✅ Done
17
+
18
+ ### [STORY-slim-111] Check Phase 4 Playwright 断言策略指南
19
+ > Spec: docs/specs/STORY-slim-111.md
20
+
21
+ - [x] 修改 project-check SKILL.md Phase 4 增加断言策略
22
+
23
+ ### [STORY-slim-110] project-design 集成 User Journey 生成
24
+ > Spec: docs/specs/STORY-slim-110.md
25
+
26
+ - [x] 修改 project-design SKILL.md Phase 1 Group B
27
+
28
+ ### [STORY-slim-109] E2E journey.md 规范定义与 File Atlas 集成
29
+ > Spec: docs/specs/STORY-slim-109.md
30
+
31
+ - [x] 注册 File Atlas
32
+ - [x] 创建 journey.md 格式规范
33
+ - [x] 修改 project-check Phase 4
34
+
35
+ ### [STORY-slim-108] pactkit-trace --summary 模式:接口摘要输出
36
+ > Spec: docs/specs/STORY-slim-108.md
37
+
38
+ - [x] 修改 pactkit-trace SKILL.md Phase 3
39
+ - [x] 修改 project-act SKILL.md Phase 1
@@ -0,0 +1,12 @@
1
+ # BUG-slim-107: Custom scan_excludes replaces defaults, leaking .next as modules
2
+
3
+ ## Background
4
+ When a project's `pactkit.yaml` defines custom `visualize.scan_excludes`, it completely replaces the built-in `SCAN_EXCLUDES` set. Projects lose critical exclusions like `.next`, causing build artifacts to be detected as modules. Combined with the root module `.` being hidden from the "Available modules" error message, this misleads AI into concluding "visual scan not applicable to Python projects".
5
+
6
+ ## Target
7
+ - `src/pactkit/skills/visualize.py:280` — merge custom excludes with defaults instead of replacing
8
+ - `src/pactkit/skills/visualize.py:1180` — include root module in available list with descriptive label
9
+
10
+ ## Fix
11
+ 1. `_detect_modules`: union custom scan_excludes with SCAN_EXCLUDES
12
+ 2. Available modules list: show root module as `"." (project root)` instead of filtering it out
@@ -0,0 +1,19 @@
1
+ # HOTFIX-slim-107: Remove residual pactkit.yaml version field operations
2
+
3
+ ## Background
4
+ STORY-slim-102 migrated version checking from pactkit.yaml to `~/.claude/.pactkit-version` global marker, but left 4 residual references that still read/write version in pactkit.yaml.
5
+
6
+ ## Target Files
7
+ | File | Line(s) | Issue |
8
+ |------|---------|-------|
9
+ | `src/pactkit/skills/board.py` | 239-256, 401-402, 417-418 | `update_version()` function + CLI entry |
10
+ | `src/pactkit/cli.py` | 146 | `--if-needed` help text references pactkit.yaml |
11
+ | `src/pactkit/prompts/commands.py` | 659 | Manual pactkit.yaml creation includes `version: 0.0.1` |
12
+ | `src/pactkit/prompts/agents.py` | 29 | "Release field (from pactkit.yaml version)" |
13
+ | `src/pactkit/prompts/skills.py` | 127-130, 152, 699 | `update_version` docs and usage |
14
+ | `src/pactkit/prompts/agents.py` | 145 | "Use update_version to update version number" |
15
+
16
+ ## Fix
17
+ - Remove `update_version()` function and CLI subcommand from board.py
18
+ - Update help text, prompts, and agent docs to remove pactkit.yaml version references
19
+ - Version is now managed in pyproject.toml + __init__.py only; deploy marker at ~/.claude/.pactkit-version